【问题标题】:Calculate several weighted average columns at once in R在R中一次计算几个加权平均列
【发布时间】:2020-10-20 17:38:21
【问题描述】:

让我们假设以下数据框(尽管我的真实数据集有更多列):

df<- data.frame(date=c(01.01.2010,02.01.2010, 03.01.2010), 
x1=c(1,2,4), y1=c(1,2,3), x2=c(1,2,2), y2=c(3,4,4), x3=c(3,3,3), y3=c(3,4,5))

Date          x1  y1  x2  y2  x3  y3
01.01.2010    1   1   1   3   3   3
02.01.2010    2   2   2   4   3   4
03.01.2010    4   3   2   4   3   5

首先,我想将所有 y 列(每隔一列)的总和计算为一个名为 y_total 的新列,并将其添加到数据框中。 其次,我想计算所有 x 列的新列,其中 x1_new= x1*(y1/y_total),x2_new= x2*(y2/y_total), x3_new= x3*(y3/y_total)。我想一次计算所有 x1_new、x2_new、n3_new 列,因为在我的真实数据集中我有多达 60 个这些列。在具体示例中,它应该如下所示:

Date          x1  y1  x2  y2  x3  y3  y_total   x1_new   x2_new   x3_new
01.01.2010    1   1   1   3   3   3     7       0.1428   0.4286   1.286
02.01.2010    2   2   2   4   3   4     10      0.4      0.8      1.2
03.01.2010    4   3   2   4   3   5     12      1        0.6666   1.25

有没有一种方法可以一次计算每个旧 x 列的新 x 列?我问这个是因为有时我有 90 x 列的数据框。 提前致谢!

【问题讨论】:

    标签: r multiple-columns calculated-columns


    【解决方案1】:

    这行得通吗:

    > library(dplyr)
    > df %>% mutate(y_total = rowSums(select(., starts_with("y"))), x1_new = x1*(y1/y_total))
            date x1 y1 x2 y2 x3 y3 y_total    x1_new
    1 01.01.2010  1  1  1  3  3  3       7 0.1428571
    2 02.01.2010  2  2  2  4  3  4      10 0.4000000
    3 03.01.2010  4  3  2  4  3  5      12 1.0000000
    > 
    

    【讨论】:

    • 这可行,但我需要一种更自动化的方式,因为有时我需要在 60 列中执行相同的操作。例如,有时有 x1_new、x2_new、...、x60_new,我想以更简洁的方式计算所有这些列。
    • 您可以考虑使用dplyr 包中的across()starts_with 来选择与某个前缀匹配的变量。
    • @ZayzayR,已经修改了我的代码,请您现在检查一下。
    • @KarthikS 谢谢,但不幸的是,这仍然不能完全解决我的问题。我已经编辑了我的问题以使其更清楚。我还需要 x2_new、x3_new 等列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2023-03-28
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多