我正在尝试由此创建一个表:
身份证 | 状况 |
---|---|
1 | B |
1 | B |
1 | A |
2 | B |
2 | B |
对此:
身份证 | 状况 | 旗帜 |
---|---|---|
1 | B | 1 |
1 | B | 1 |
1 | A | 1 |
2 | B | 0 |
2 | B | 0 |
即如果同一 ID 的任何行中的条件为 A,则该标志将为同一 ID 的所有行返回 1。
我尝试过这样的事情:
library(dplyr)
data %>%
group_by(ID) %>%
mutate(Flag = ifelse(Condition == 1, 1, 0)
但它只是返回这个:
身份证 | 状况 | 旗帜 |
---|---|---|
1 | B | 0 |
1 | B | 0 |
1 | A | 1 |
2 | B | 0 |
2 | B | 0 |
抱歉,如果不清楚,如果您还需要我回答这个问题,请告诉我。谢谢。
ifelse
是逐元素 if-else
语句,例如向量化,它无法给出所需的输出。
您可以使用
if ... else ...
代替 ifelse
> df %>% mutate(Flag = if (any(Condition == "A")) 1 else 0, .by = ID)
ID Condition Flag
1 1 B 1
2 1 B 1
3 1 A 1
4 2 B 0
5 2 B 0
或者你可以尝试
%in%
> df %>% mutate(Flag = +("A" %in% Condition), .by = ID)
ID Condition Flag
1 1 B 1
2 1 B 1
3 1 A 1
4 2 B 0
5 2 B 0
由于您的
Flag
列本质上是合乎逻辑的,因此您可以使用 any
来测试每个 (.by
) ID 是否有“A”。
library(dplyr)
df %>% mutate(Flag = as.integer(any(Condition == "A")), .by = ID)
ID Condition Flag
1 1 B 1
2 1 B 1
3 1 A 1
4 2 B 0
5 2 B 0