如何创建一个布尔列,根据 ID 列共同响应另一列(使用 dplyr)?

问题描述 投票:0回答:2

我正在尝试由此创建一个表:

身份证 状况
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

抱歉,如果不清楚,如果您还需要我回答这个问题,请告诉我。谢谢。

r dataframe dplyr
2个回答
3
投票

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

2
投票

由于您的

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
© www.soinside.com 2019 - 2024. All rights reserved.