我的数据如下:
library(dplyr)
Source <- c(rep("A", 3), rep("B", 3))
ID <- c("X1", "X2", "X3", "X1", "X2", "X3")
Treatment <- c(0, 0, 1, 0, 0, 0)
Measure <- rnorm(n = 6, mean = 10)
df <- tibble(Source, ID, Treatment, Measure)
df
# A tibble: 6 x 4
Source ID Treatment Measure
<chr> <chr> <dbl> <dbl>
1 A X1 0 10.2
2 A X2 0 8.86
3 A X3 1 11.3
4 B X1 0 10.4
5 B X2 0 9.70
6 B X3 0 10.9
我想要的是一个与Treatment
具有相同长度的变量,但如果给定源下的任何 ID具有treatment = 1,则取值1,如果不是,则取0 。类似于Excel中的MAXIFS()函数,它可以通过将其放入单元格来提供我想要的内容:
=MAXIFS([Treatment], [Source], [@[Source]])
但是我需要在dplyr中使用它,原因与我的示例数据的IRL版本的复杂性有关,后者更大更复杂。
答案 0 :(得分:2)
在我用ungroup()
认识到解决方案很简单之前,我已经写完这个问题并准备发布了:
fixed_df <- df %>%
group_by(Source) %>%
mutate(Treated = max(Treatment)) %>%
ungroup()
fixed_df
# A tibble: 6 x 5
Source ID Treatment Measure Treated
<chr> <chr> <dbl> <dbl> <dbl>
1 A X1 0 10.2 1
2 A X2 0 8.86 1
3 A X3 1 11.3 1
4 B X1 0 10.4 0
5 B X2 0 9.70 0
6 B X3 0 10.9 0