【问题标题】:If function on a for loopif 函数在 for 循环中
【发布时间】:2015-11-12 13:04:00
【问题描述】:

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

一个(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 的相应值.

【问题讨论】:

  • 请编辑您的预期输出。此外,您的数据的 dput 会很好
  • 使用 dplyr。 result <- dplyr::full_join(dataframe1, dataframe2)

标签: r


【解决方案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

【讨论】:

    【解决方案2】:

    您正在寻找的是data.frames 的join(至少在我看来)。这包括匹配两个项目的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.tables 在许多方面与data.frames 相似)没有任何匹配,您可以这样做:

    dt1$Value <- dt2$Value
    

    【讨论】:

    • 非常感谢您的帮助。我编辑我的问题。我希望你能更好地了解了解。非常感谢!
    • 我编辑了适合您问题的代码。 all.x = T 语句就是解决方案。你试过了吗?
    • 是的,我试过了。这些值是按我的意愿添加的。谢谢你!尽管“天”列的顺序以不同的顺序出现(在结果上)。例如,在数据框“a”上,“日”列类似于:1、2、3、4、5、6、7、8、9、10、11... 现在看起来像:“2、1、6 , 3"
    • 只需将结果包装在order(Day) 中。如果答案有帮助,请考虑投票并将其标记为答案。
    • 我这样做虽然我没有得到我需要的东西...我希望列“年”“月”和“日”留在结果数据框上...然后以相同的顺序数据框“a”上显示的内容...我不确定您是否能理解我...提前致谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2019-12-04
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多