【问题标题】:Subtract values within group减去组内的值
【发布时间】:2021-03-28 19:44:29
【问题描述】:

我有一个数据框:

set.seed(42)
ID <- sample(1:15, 100, replace = TRUE)
value <- sample(1:4, 100, replace = TRUE)
d <- data.frame(ID, value)

我想按 ID 分组,并创建一个新列,其中每个值都从组内的所有其他值中减去。

像 sum 一样将所有这些值添加到单个列中,我该如何减去?

library(dplyr)
d %>%
group_by(ID) %>%
# what's the - equivalent! 
  mutate(value_c = sub(value))

谢谢

J

【问题讨论】:

  • 您能否创建一个例如 10 行的示例并根据该示例显示预期的输出?
  • 减法是什么意思? -1 * sum()??您为什么要尝试使用 grep 系列中的 sub 函数??

标签: r dplyr


【解决方案1】:

嗯,这是一个有点奇怪的计算,但令我惊讶的是,以下似乎与您解释的一样:


set.seed(42)
ID <- sample(1:15, 100, replace = TRUE)
value <- sample(1:4, 100, replace = TRUE)
d <- data.frame(ID, value)

d %>% group_by( ID ) %>%
    mutate(
        value_c = value*2 - sum(value)
    ) %>%
    arrange( ID ) %>%
    head( n=20 )

生产:


# A tibble: 20 x 3
# Groups:   ID [3]
      ID value value_c
   <int> <int>   <dbl>
 1     1     1     -12
 2     1     1     -12
 3     1     4      -6
 4     1     1     -12
 5     1     1     -12
 6     1     2     -10
 7     1     4      -6
 8     2     4     -21
 9     2     3     -23
10     2     3     -23
11     2     2     -25
12     2     1     -27
13     2     1     -27
14     2     3     -23
15     2     3     -23
16     2     1     -27
17     2     4     -21
18     2     4     -21
19     3     4      -8
20     3     4      -8


你将 value 乘以 2,因为无论如何它都会在 sum() 中,这是你不想要的,所以将它添加回左侧就可以解决这个问题。

【讨论】:

    【解决方案2】:

    这是使用 ave 的基本 R 选项

    transform(
      d,
      value_c = 2*value - ave(value,ID,FUN = sum)
    )
    

    【讨论】:

      【解决方案3】:

      data.table 的选项

      library(data.table)
      setDT(d)[, value_c := 2 * value - sum(value), ID]
      

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 2013-12-21
        • 2012-02-25
        • 2018-08-24
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        相关资源
        最近更新 更多