【问题标题】:multiply a data.frame by a column with matching condition将 data.frame 乘以具有匹配条件的列
【发布时间】:2018-04-22 03:50:26
【问题描述】:

我想将一个 df 中的几列乘以另一个 df 中的一列。

df1 和 df2 有一个名为“year_quarter”的列。我希望 df1 中的许多列乘以 df2 中的列,以便 year_quarter 匹配。

df1

year_quarter   col1    col2    col3
2010Q1         5       0.34    0.45
2010Q1         4       0.45    0.34
2010Q1         6       0.63    0.86
2010Q1         2       0.75    0.45
2010Q2         3       0.78    0.27
2010Q2         5       0.43    0.38
2010Q2         2       0.34    0.74
2010Q2         1       0.87    0.35
2010Q3         5       0.34    0.45
2010Q3         8       0.54    0.42
2010Q3         9       0.23    0.45
2010Q3         3       0.74    0.34
2010Q4         2       0.72    0.78
2010Q4         7       0.62    0.91
2010Q4         2       0.74    0.10
2010Q4         6       0.73    0.09

df2

year_quarter    ratio
2010Q1          0.96
2010Q2          1.34
2010Q3          1.92
2010Q4          0.74

我想将 df1 中的 col1、col2 和 col3 乘以 df2 中的比率,其中 year_quarter 在两个 dfs 中都匹配。即如果 df1 中的 Quarter_year = 2010Q1,那么对于 2010Q1 的所有实例,col1、col2 和 col3 应乘以 0.96,依此类推。

【问题讨论】:

  • 如果不匹配,假设 df1 中有四分之一没有出现在 df2 中,您想要什么行为?有可能吗?
  • 我想打印 df1 中存在但 df2 中不存在的季度名称,这可能吗?

标签: r dataframe merge mapping multiplication


【解决方案1】:

我们可以使用match 做到这一点。匹配两个数据帧中的相似列,然后获取相应的ratio 值并将其乘以df1,不包括第一列。

df2$ratio[match(df1$year_quarter, df2$year_quarter)] * df1[-1]


#    col1   col2   col3
#1   4.80 0.3264 0.4320
#2   3.84 0.4320 0.3264
#3   5.76 0.6048 0.8256
#4   1.92 0.7200 0.4320
#5   4.02 1.0452 0.3618
#6   6.70 0.5762 0.5092
#7   2.68 0.4556 0.9916
#8   1.34 1.1658 0.4690
#9   9.60 0.6528 0.8640
#10 15.36 1.0368 0.8064
#11 17.28 0.4416 0.8640
#12  5.76 1.4208 0.6528
#13  1.48 0.5328 0.5772
#14  5.18 0.4588 0.6734
#15  1.48 0.5476 0.0740
#16  4.44 0.5402 0.0666

【讨论】:

    【解决方案2】:

    使用 dplyr,您可以合并两个数据集,然后应用 mutate 函数来更改所需列的值,如果您不需要它,最终可以使用 %>% select(-ratio) 删除比率列

    library(dplyr)
    left_join(df1, df2) %>% mutate_at(vars(starts_with("col")), funs(.*ratio))
    

    左连接行为是这样的,例如,如果您的第一个 data.frame 中有 2011 年的日期,它将离开行 NA(在 Ronak 的回答中行为相同)

    【讨论】:

    • 我猜你也可以使用sweep 函数,但不那么直接
    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多