R在for循环中从data.table中提取元素
R Extracting elements from data.table in for loop
我有两个data.tables。一个 data.table (dt1) 包含个人来自哪里(国家)和个人出生时间(日期)的信息。另一个 data.table (dt2) 包含每个国家和每年的索引。
dt1 <- data.table(country=c("Argentina", "Brazil", "United States"),
date = c("2012-25-12", "2015-21-05", "2017-01-06"))
dt2 <- data.table(country=c("Argentina", "Brazil", "United States"),
"2012" = c(0.25, 0.85, 0.11),
"2013" = c(0.43, 0.23, 0.95),
"2014" = c(0.35, 0.45, 0.66),
"2015" = c(0.45, 0.63, 0.45),
"2016" = c(0.78, 0.54, 0.22),
"2017" = c(0.22, 0.22, 0.32))
我想将一个 data.table (dt2) 的信息添加到另一个 data.table (dt1),具体取决于年份和国家/地区。
我试过 for 循环
years <- as.character(2012:2017)
for(i in 1:length(years)){
for(j in countries)
{dt1[country==j & date <=as.Date(paste0(years[i], "-12-31")), index:=dt2[country==(j), (1+i)]]
}
}
我希望 dt1 看起来像这样:
country date index
1: Argentina 2012-12-25 0.25
2: Brazil 2015-05-21 0.63
3: United States 2017-01-06 0.32
相反,dt1 看起来像这样:
country date index
1: Argentina 2012-12-25 7
2: Brazil 2015-05-21 7
3: United States 2017-01-06 7
即索引等于最后的1+i,即循环的第6次迭代
我需要更改什么才能使索引实际上是 dt2 中满足国家和年份条件的元素?
我感谢任何帮助和反馈,即使这个问题不够清晰或可重复。
谢谢
尝试合并():
merge(x = dt1, y = dt2, by="country")
merge(
dt1[, year := substr(date, 1, 4)],
melt(dt2, id = "country", variable.name = "year", value.name = "index")
)
# country year date index
# 1: Argentina 2012 2012-25-12 0.25
# 2: Brazil 2015 2015-21-05 0.63
# 3: United States 2017 2017-01-06 0.32
我有两个data.tables。一个 data.table (dt1) 包含个人来自哪里(国家)和个人出生时间(日期)的信息。另一个 data.table (dt2) 包含每个国家和每年的索引。
dt1 <- data.table(country=c("Argentina", "Brazil", "United States"),
date = c("2012-25-12", "2015-21-05", "2017-01-06"))
dt2 <- data.table(country=c("Argentina", "Brazil", "United States"),
"2012" = c(0.25, 0.85, 0.11),
"2013" = c(0.43, 0.23, 0.95),
"2014" = c(0.35, 0.45, 0.66),
"2015" = c(0.45, 0.63, 0.45),
"2016" = c(0.78, 0.54, 0.22),
"2017" = c(0.22, 0.22, 0.32))
我想将一个 data.table (dt2) 的信息添加到另一个 data.table (dt1),具体取决于年份和国家/地区。
我试过 for 循环
years <- as.character(2012:2017)
for(i in 1:length(years)){
for(j in countries)
{dt1[country==j & date <=as.Date(paste0(years[i], "-12-31")), index:=dt2[country==(j), (1+i)]]
}
}
我希望 dt1 看起来像这样:
country date index
1: Argentina 2012-12-25 0.25
2: Brazil 2015-05-21 0.63
3: United States 2017-01-06 0.32
相反,dt1 看起来像这样:
country date index
1: Argentina 2012-12-25 7
2: Brazil 2015-05-21 7
3: United States 2017-01-06 7
即索引等于最后的1+i,即循环的第6次迭代
我需要更改什么才能使索引实际上是 dt2 中满足国家和年份条件的元素?
我感谢任何帮助和反馈,即使这个问题不够清晰或可重复。 谢谢
尝试合并():
merge(x = dt1, y = dt2, by="country")
merge(
dt1[, year := substr(date, 1, 4)],
melt(dt2, id = "country", variable.name = "year", value.name = "index")
)
# country year date index
# 1: Argentina 2012 2012-25-12 0.25
# 2: Brazil 2015 2015-21-05 0.63
# 3: United States 2017 2017-01-06 0.32