may*_*cca 1 expand r filter dplyr
我想在 my 中创建新列dat,由满足条件的值填充。所以,我想保留valuewhere whereregime == "SA"并在 new column 中的整个组中填充此值vals.sa。
这结合了filterand mutate,但我不确定它们的正确组合是什么?Filter只是保持行满足条件,但如何在组中的所有行上扩展此值?
我的数据:
dat <- data.frame(id = c(1,1,2,2,2,2,3,3),
regime = c("SA", "B", "SA", "B", "C", "F", "SA", "D"),
value = c(3,5,1,2,5,6,7,8))
Run Code Online (Sandbox Code Playgroud)
使用处理数据 dplyr
dat %>%
# group data by id
group_by(id) %>%
# how to write this condition and get values instead or TRUE/FALSE?
mutate(val.sa = regime == "SA")
Run Code Online (Sandbox Code Playgroud)
与填充val.sa值对应的预期输出regime == "SA"
id regime value val.sa
<dbl> <fct> <dbl> <dbl>
1 1 SA 3 3
2 1 B 5 3
3 2 SA 1 1
4 2 B 2 1
5 2 C 5 1
6 2 F 6 1
7 3 SA 7 7
8 3 D 8 7
Run Code Online (Sandbox Code Playgroud)
您可以使用 :
library(dplyr)
dat %>%
group_by(id) %>%
mutate(value.sa = value[regime == 'SA'])
#OR
#mutate(value.sa = value[match('SA', regime)])
# id regime value value.sa
# <dbl> <chr> <dbl> <dbl>
#1 1 SA 3 3
#2 1 B 5 3
#3 2 SA 1 1
#4 2 B 2 1
#5 2 C 5 1
#6 2 F 6 1
#7 3 SA 7 7
#8 3 D 8 7
Run Code Online (Sandbox Code Playgroud)
如果regime一个组中有多个值"SA",您可以使用which.max/选择第一个值match。
dat %>%
group_by(id) %>%
mutate(value.sa = value[which.max(regime == 'SA')])
Run Code Online (Sandbox Code Playgroud)