使用 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
我的数据框是这样的
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