【问题标题】:Perform calculation for multiple groups with columns from seperate data frames使用来自不同数据框的列对多个组执行计算
【发布时间】:2018-03-01 13:13:39
【问题描述】:

我想对多个组执行简单的计算,其中来自单独数据帧的列根据唯一标识符相乘。这是第一个数据框:

year1 <- c(rep(2016,3),rep(2017,3),rep(2018,3))
group <- rep(letters[1:3],3)
prop <- c(0.3,0.6,0.1,0.4,0.3,0.3,0.2,0.5,0.3)
df1 <- as.data.frame(cbind(year1,group,prop))
df1$prop <- as.numeric(as.character(df1$prop))

这是第二个:

year2 <- c(2016,2017,2018)
value <- c(325,483,742)
df2 <- as.data.frame(cbind(year2,value))

我现在想在第一个数据框中添加一列,其中 df1 中的每个 year1group propvalue 相乘以得到 df2 中对应的 year2 .

理论上,使用group_bymutate 的解决方案可以解决问题,但我不知道如何使用这些命令为两个数据帧索引year。任何建议将不胜感激。谢谢!

【问题讨论】:

  • 不要在data.frame 之前使用cbind。它打破了这个例子,使year1 不能很好地加入year2,一个数字......例如,做df1 = data.frame(year1,group,prop)

标签: r loops dplyr data.table grouping


【解决方案1】:

您可以通过两个表之间的连接来实现此目的。这可以在基础 R 中使用 merge 函数来完成,或者在 dplyr 中使用几个连接函数之一来完成。我在这个例子中使用了 left_join。

您的 df1 数据框示例将年份设置为一个因素,因此必须先将其转换为数字。你的真实数据可能没有这个问题。下例中的左连接用于确保 df1 中的所有行都存在于连接结果中。

df1$year1 = as.numeric(as.character(df1$year1))
df3 = 
  left_join(df1, df2, by = c("year1" = "year2")) %>%
  mutate(result = prop * value)

>df3
  year1 group prop value result
1  2016     a  0.3   325   97.5
2  2016     b  0.6   325  195.0
3  2016     c  0.1   325   32.5
4  2017     a  0.4   483  193.2
5  2017     b  0.3   483  144.9
6  2017     c  0.3   483  144.9
7  2018     a  0.2   742  148.4
8  2018     b  0.5   742  371.0
9  2018     c  0.3   742  222.6

【讨论】:

    【解决方案2】:

    另一种方式:

    ## using data.table
    setDT(df1)
    setDT(df2)
    
    # set column types of key columns to be same
    df1[, year1 := as.numeric()]
    
    # merge files and get result
    df1 <- merge(df1, df2, by.x = 'year1', by.y = 'year2')
    df1[,result := prop*value, .(year1, group)]
    
       year1 group prop value result
    1:  2016     a  0.3   325   97.5
    2:  2016     b  0.6   325  195.0
    3:  2016     c  0.1   325   32.5
    4:  2017     a  0.4   483  193.2
    5:  2017     b  0.3   483  144.9
    6:  2017     c  0.3   483  144.9
    7:  2018     a  0.2   742  148.4
    8:  2018     b  0.5   742  371.0
    9:  2018     c  0.3   742  222.6
    

    【讨论】:

    • 更惯用的方式:df1[df2, on=.(year1=year2), v := prop*value]
    • 但在下一步中,它还需要按“组”列分组。
    • 在逐个元素相乘的上下文中,分组是没有意义的。尝试删除整个 by=.(year1, group),您会看到相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多