在复杂的数据结构中为具有条件的其他组成员赋值
Assign value to other group members with conditions in a complex data structure
一个MWE如下:
df = tibble(
Group = c(rep(1,9), rep(2,9)),
Stage = rep(c(1,1,1,rep(2,6)),2),
Period = rep(c(rep(1,6),2,2,2),2),
Role = rep(c(NA,NA,NA,0,1,0,0,0,1),2),
Value = round(rnorm(n=18,mean=10,sd=5), digits = 1)
)
# A tibble: 18 x 5
Group Stage Period Role Value
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 NA 10.8
2 1 1 1 NA 15.5
3 1 1 1 NA 7.4
4 1 2 1 0 3.7
5 1 2 1 1 6.7
6 1 2 1 0 7.5
7 1 2 2 0 15.1
8 1 2 2 0 8.2
9 1 2 2 1 5.1
10 2 1 1 NA 17.3
11 2 1 1 NA 14.9
12 2 1 1 NA 11.1
13 2 2 1 0 13.3
14 2 2 1 1 3.6
15 2 2 1 0 7.2
16 2 2 2 0 13.1
17 2 2 2 0 16.5
18 2 2 2 1 11
关于 df
的注释:在 df
中,对于每个组,他们经历多个阶段的第 1 阶段和第 2 阶段。在第 2 阶段,一名小组成员被分配了一个独特的角色。
我的objective:在第2阶段,我想把Role 1
的值分配给每个小组每个时期的其他小组成员。期望的结果是:
# A tibble: 18 x 5
Group Stage Period Role Value newValue
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 NA 10.8 10.8
2 1 1 1 NA 15.5 15.5
3 1 1 1 NA 7.4 7.4
4 1 2 1 0 3.7 6.7
5 1 2 1 1 6.7 6.7
6 1 2 1 0 7.5 6.7
7 1 2 2 0 15.1 5.1
8 1 2 2 0 8.2 5.1
9 1 2 2 1 5.1 5.1
10 2 1 1 NA 17.3 17.3
11 2 1 1 NA 14.9 14.9
12 2 1 1 NA 11.1 11.1
13 2 2 1 0 13.3 3.6
14 2 2 1 1 3.6 3.6
15 2 2 1 0 7.2 3.6
16 2 2 2 0 13.1 11
17 2 2 2 0 16.5 11
18 2 2 2 1 11 11
我可以简单的把df
按Stage分成两个tibble,然后用David Arenburg建议的解决问题如下:
df_Stage2 <- df %>% filter (Stage == 2) %>%
group_by(Group, Period) %>%
mutate(newValue = Value[Role == 1]) %>%
ungroup
但是,我相信有一种方法可以对整个数据结构进行处理。我尝试了 if_else
和 case_when
方法,例如:
df <- df %>%
group_by(Group, Period) %>%
mutate(
newValue = if_else(Stage == 1, -99, Value[Role == 1])
) %>%
ungroup
但是,这两种方法都不起作用。有没有办法不用把df
按Stage分成两个df
就可以解决这个问题?非常感谢!
另外,在建议的解决方案中,他使用Value[Role == 1L]
而不是Value[Role == 1]
,谁能解释一下这里的L
是做什么的?
你可以在这里使用match
-
library(dplyr)
df %>%
group_by(Group, Stage, Period) %>%
mutate(NewValue = ifelse(Stage == 2, Value[match(1, Role)], Value)) %>%
ungroup()
# Group Stage Period Role Value NewValue
# <int> <int> <int> <int> <dbl> <dbl>
# 1 1 1 1 NA 10.8 10.8
# 2 1 1 1 NA 15.5 15.5
# 3 1 1 1 NA 7.4 7.4
# 4 1 2 1 0 3.7 6.7
# 5 1 2 1 1 6.7 6.7
# 6 1 2 1 0 7.5 6.7
# 7 1 2 2 0 15.1 5.1
# 8 1 2 2 0 8.2 5.1
# 9 1 2 2 1 5.1 5.1
#10 2 1 1 NA 17.3 17.3
#11 2 1 1 NA 14.9 14.9
#12 2 1 1 NA 11.1 11.1
#13 2 2 1 0 13.3 3.6
#14 2 2 1 1 3.6 3.6
#15 2 2 1 0 7.2 3.6
#16 2 2 2 0 13.1 11
#17 2 2 2 0 16.5 11
#18 2 2 2 1 11 11
一个MWE如下:
df = tibble(
Group = c(rep(1,9), rep(2,9)),
Stage = rep(c(1,1,1,rep(2,6)),2),
Period = rep(c(rep(1,6),2,2,2),2),
Role = rep(c(NA,NA,NA,0,1,0,0,0,1),2),
Value = round(rnorm(n=18,mean=10,sd=5), digits = 1)
)
# A tibble: 18 x 5
Group Stage Period Role Value
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 NA 10.8
2 1 1 1 NA 15.5
3 1 1 1 NA 7.4
4 1 2 1 0 3.7
5 1 2 1 1 6.7
6 1 2 1 0 7.5
7 1 2 2 0 15.1
8 1 2 2 0 8.2
9 1 2 2 1 5.1
10 2 1 1 NA 17.3
11 2 1 1 NA 14.9
12 2 1 1 NA 11.1
13 2 2 1 0 13.3
14 2 2 1 1 3.6
15 2 2 1 0 7.2
16 2 2 2 0 13.1
17 2 2 2 0 16.5
18 2 2 2 1 11
关于 df
的注释:在 df
中,对于每个组,他们经历多个阶段的第 1 阶段和第 2 阶段。在第 2 阶段,一名小组成员被分配了一个独特的角色。
我的objective:在第2阶段,我想把Role 1
的值分配给每个小组每个时期的其他小组成员。期望的结果是:
# A tibble: 18 x 5
Group Stage Period Role Value newValue
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 NA 10.8 10.8
2 1 1 1 NA 15.5 15.5
3 1 1 1 NA 7.4 7.4
4 1 2 1 0 3.7 6.7
5 1 2 1 1 6.7 6.7
6 1 2 1 0 7.5 6.7
7 1 2 2 0 15.1 5.1
8 1 2 2 0 8.2 5.1
9 1 2 2 1 5.1 5.1
10 2 1 1 NA 17.3 17.3
11 2 1 1 NA 14.9 14.9
12 2 1 1 NA 11.1 11.1
13 2 2 1 0 13.3 3.6
14 2 2 1 1 3.6 3.6
15 2 2 1 0 7.2 3.6
16 2 2 2 0 13.1 11
17 2 2 2 0 16.5 11
18 2 2 2 1 11 11
我可以简单的把df
按Stage分成两个tibble,然后用David Arenburg建议的
df_Stage2 <- df %>% filter (Stage == 2) %>%
group_by(Group, Period) %>%
mutate(newValue = Value[Role == 1]) %>%
ungroup
但是,我相信有一种方法可以对整个数据结构进行处理。我尝试了 if_else
和 case_when
方法,例如:
df <- df %>%
group_by(Group, Period) %>%
mutate(
newValue = if_else(Stage == 1, -99, Value[Role == 1])
) %>%
ungroup
但是,这两种方法都不起作用。有没有办法不用把df
按Stage分成两个df
就可以解决这个问题?非常感谢!
另外,在Value[Role == 1L]
而不是Value[Role == 1]
,谁能解释一下这里的L
是做什么的?
你可以在这里使用match
-
library(dplyr)
df %>%
group_by(Group, Stage, Period) %>%
mutate(NewValue = ifelse(Stage == 2, Value[match(1, Role)], Value)) %>%
ungroup()
# Group Stage Period Role Value NewValue
# <int> <int> <int> <int> <dbl> <dbl>
# 1 1 1 1 NA 10.8 10.8
# 2 1 1 1 NA 15.5 15.5
# 3 1 1 1 NA 7.4 7.4
# 4 1 2 1 0 3.7 6.7
# 5 1 2 1 1 6.7 6.7
# 6 1 2 1 0 7.5 6.7
# 7 1 2 2 0 15.1 5.1
# 8 1 2 2 0 8.2 5.1
# 9 1 2 2 1 5.1 5.1
#10 2 1 1 NA 17.3 17.3
#11 2 1 1 NA 14.9 14.9
#12 2 1 1 NA 11.1 11.1
#13 2 2 1 0 13.3 3.6
#14 2 2 1 1 3.6 3.6
#15 2 2 1 0 7.2 3.6
#16 2 2 2 0 13.1 11
#17 2 2 2 0 16.5 11
#18 2 2 2 1 11 11