我有两个具有不同行数和列数的数据帧,例如:
a (12981行和3列)
Year Month Day
1980 1 1
1980 1 2
1980 1 3
1980 1 4
1980 1 5
...
1980 1 31
1980 2 1
1980 2 2
1980 2 3
1980 2 4
1980 2 5
...
b (426行和3列)
Year Month Value
1980 1 356
1980 2 389
1980 3 378
1980 4 450
1980 5 500
...
1981 2 450
我想添加"价值"列(从 b )到 a 以获得以下内容:
a_withValues (12981行,4列)
Year Month Day Value
1980 1 1 356
1980 1 2 356
1980 1 3 356
1980 1 4 356
1980 1 5 356
...
1980 1 31 356
1980 2 1 389
1980 2 2 389
1980 2 3 389
1980 2 4 389
1980 2 5 389
...
换句话说,如果a$Year
和a$Month
等于b$Year
和b$Month
我想添加(对于 a 中的新列)来自b$Value
的相应值。
答案 0 :(得分:1)
有一个基本R解决方案,只需使用函数merge
。默认情况下,它会选择具有匹配名称的列,因此在您的情况下,它将开箱即用
a <- expand.grid(year=1980, month=1:2, day=1:30)
b <- data.frame(year=1980, month=1:2, value=c(356,389))
a_with_b <- merge(a,b)
下面:
> head(a)
year month day
1 1980 1 1
2 1980 2 1
3 1980 1 2
4 1980 2 2
5 1980 1 3
6 1980 2 3
> head(b)
year month value
1 1980 1 356
2 1980 2 389
> head(a_with_b)
year month day value
1 1980 1 1 356
2 1980 1 8 356
3 1980 1 2 356
4 1980 1 9 356
5 1980 1 3 356
6 1980 1 10 356
答案 1 :(得分:0)
您正在寻找的是join
data.frames(至少根据我的理解)。这包括匹配两个项目的keys
,然后将值添加为另一个列。
您可以使用data.table
:
library(data.table)
dt1 <- data.table(Year = 1980,
Month = 1:3,
Day = 1)
dt1
# Year Month Day
# 1: 1980 1 1
# 2: 1980 2 1
# 3: 1980 3 1
dt2 <- data.table(Year = 1980,
Month = 1:3,
Value = runif(3, 100, 1000))
dt2
# Year Month Value
# 1: 1980 1 389.7436
# 2: 1980 2 902.0029
# 3: 1980 3 663.6313
merge(dt1, dt2, by = c("Year", "Month"), all.x = T)[order(Year, Month)]
# Year Month Day Value
# 1: 1980 1 1 389.7436
# 2: 1980 2 1 902.0029
# 3: 1980 3 1 663.6313
如果您只想在一个data.table中创建另一列(注意,data.table
s在许多方面与data.frame
类似),没有任何匹配,您可以这样做:
dt1$Value <- dt2$Value