使用 R 中的 dplyr 改变数据中特定组的值

Mutate the values of a specific group in your data with dplyr in R

我的数据框是这样的

value <- c(0,0.1,0.2,0.4,0,0.05,0.05,0.5,0.20,0.40,0.50,0.60)
time <- c(1,1,1,1,2,2,2,2,3,3,3,3)
ID <- c(1,2,3,4,1,2,3,4,1,2,3,4)

test <- data.frame(value, time, ID)
test

   value time ID
1   0.00    1  1
2   0.10    1  2
3   0.20    1  3
4   0.40    1  4
5   0.00    2  1
6   0.05    2  2
7   0.05    2  3
8   0.50    2  4
9   0.20    3  1
10  0.40    3  2
11  0.50    3  3
12  0.60    3  4

在这个例子中,我将用 1 减去 time==2 的值,我的数据看起来像这样 像 mutate(time[time==2]= time[time==2] -1) 这样的东西当然不可能

   value time ID
1   0.00    1  1
2   0.10    1  2
3   0.20    1  3
4   0.40    1  4
5   0.00    1  1
6   0.05    1  2
7   0.05    1  3
8   0.50    1  4
9   0.20    3  1
10  0.40    3  2
11  0.50    3  3
12  0.60    3  4

非常感谢任何提示和帮助

编辑

一种方法是替换该值,但我该如何减去它呢? mutate(time=replace(time, time==2, 1))

您可以使用 case_when() 来执行此操作。下面的代码将在 time 等于 2 时将 time 替换为 1,否则将 returns 替换为 time 的值。请注意,这看起来并不完全像您想要的输出,因为它生成的是 1 和 3,而不是 0 和 1。

library(dplyr)
test <- test %>% 
  mutate(time = case_when(
    time == 2 ~ 1, 
    TRUE ~ time
  ))
test
#    value time ID
# 1   0.00    1  1
# 2   0.10    1  2
# 3   0.20    1  3
# 4   0.40    1  4
# 5   0.00    1  1
# 6   0.05    1  2
# 7   0.05    1  3
# 8   0.50    1  4
# 9   0.20    3  1
# 10  0.40    3  2
# 11  0.50    3  3
# 12  0.60    3  4

要生成与上述所需输出完全相同的内容,您需要:

test <- test %>% 
  mutate(time = case_when(
    time == 1 ~ 0, 
    TRUE ~ 1
  ))
test
#    value time ID
# 1   0.00    0  1
# 2   0.10    0  2
# 3   0.20    0  3
# 4   0.40    0  4
# 5   0.00    0  1
# 6   0.05    0  2
# 7   0.05    0  3
# 8   0.50    0  4
# 9   0.20    1  1
# 10  0.40    1  2
# 11  0.50    1  3
# 12  0.60    1  4

要在 time == 2 时将时间值减 1,您可以这样做:

library(dplyr)

test %>% mutate(time= time - as.integer(time == 2))

#   value time ID
#1   0.00    1  1
#2   0.10    1  2
#3   0.20    1  3
#4   0.40    1  4
#5   0.00    1  1
#6   0.05    1  2
#7   0.05    1  3
#8   0.50    1  4
#9   0.20    3  1
#10  0.40    3  2
#11  0.50    3  3
#12  0.60    3  4