【问题标题】:Apply a variable operation, depending on groups using tidyverse [R]根据使用 tidyverse [R] 的组应用变量操作
【发布时间】:2020-04-11 20:45:41
【问题描述】:

我什至不太确定如何用谷歌搜索我的问题,所以我认为一个例子最能说明我想要实现的目标。总之,我想将数据框的每个值相乘,按某个变量分组,乘法值将取决于它是哪个组。我举个例子:

    data <- data.frame(group = c("a", "b", "c"), value = c(1, 2, 3))
    multiplier <- c(a = 1, b = 2, c = 3)

    data %>% 
    group_by(group) %>%
    // Something that multiplies the value column by the corresponding multiplier contained in the vector

编辑:

替换值列的预期返回值应分别为1、4、9的顺序。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    我认为应该这样做:

    library(dplyr)
    data %>%
        mutate(value = value * multiplier[as.character(group)])
    #  group value
    #1     a     1
    #2     b     4
    #3     c     9
    

    或者,您可以将multiplier 附加为data 的列,然后计算。

    data %>%
        mutate(mutiplier = multiplier[as.character(group)]) %>%
        mutate(new.value = value * multiplier)
    #  group value mutiplier new.value
    #1     a     1         1         1
    #2     b     2         2         4
    #3     c     3         3         9
    

    【讨论】:

    • 谢谢!!!如果乘数值存在于数据框中,组在一列中,乘数在另一列中,它会类似于您展示的解决方案,或者最好将乘数传递给向量并将其命名为组?
    • 有趣的问题。我几乎将乘数分配为 data.frame 中的一列。我将使用dplyr 方法编辑我的答案。
    • 似乎是一个非常有趣的方法!如果我错了,请纠正我,例如,如果乘数向量与数据帧长度不同,则通过添加该列,例如组“a”的所有条目将具有对应的乘数,该乘数与该组的所有观测值重复?希望我解释了自己
    • 正确。考虑data = data.frame(group = rep(c("a","b","c"),each=2), value = 1:6)。在这种情况下,multiplier 列将是 c(1,1,2,2,3,3)
    【解决方案2】:

    base R,我们可以做

    transform(merge(data, stack(multiplier), by.x = 'group', by.y = 'ind'),
            value = value * values)[-3]
    #   group value
    #1     a     1
    #2     b     4
    #3     c     9
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多