我有一个数据框:
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
答案 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
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]