如果在for循环上运行

时间:2015-11-12 13:04:00

标签: r

我有两个具有不同行数和列数的数据帧,例如:

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$Yeara$Month等于b$Yearb$Month我想添加(对于 a 中的新列)来自b$Value的相应值。

2 个答案:

答案 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