减去组内的值

时间:2021-03-28 19:44:29

标签: r dplyr

我有一个数据框:

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

3 个答案:

答案 0 :(得分:3)

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


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() 中,这是您不想要的,因此将其添加回左侧即可解决这个问题。

答案 1 :(得分:3)

这是一个使用 ave

的基本 R 选项
transform(
  d,
  value_c = 2*value - ave(value,ID,FUN = sum)
)

答案 2 :(得分:3)

带有 data.table 的选项

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