Создать новый столбец на основе появления хотя бы одной переменной в другом столбце по группе

Рассмотрим следующий фрейм данных:

ID <- c(1,1,1,2,2,3,3,3,3)
A <- c("No","No","Yes","Yes","Yes","No","No","No","No")
B <- c("Yes","Yes","Yes","Yes","Yes","No","No","No","No")
df <- data.frame(ID,A,B)

Я хочу создать столбец B, где появление хотя бы одного «Да» в столбце A приводит только к значениям «Да» в столбце B для каждого отдельного идентификатора. Я пробовал два следующих подхода (я чувствую, что почти достиг цели):

library(dplyr)
df <- df %>% 
  group_by(ID) %>% 
  mutate(B1=ifelse(A == "Yes", "Yes", "No")) # B1 is the new column for comparison

к сожалению, это дает тот же столбец, что и A

а также

df2 <- transform(df, B1= ave(A, ID, FUN=function(x) x[A == "Yes"]))

выдает сообщение об ошибке:

1: In x[...] ‹- m : количество элементов для замены не кратно длине замены

Помощь будет высоко оценена.


person ykl    schedule 27.11.2017    source источник
comment
Можете ли вы показать мне пример желаемого результата?   -  person Edward Tyler    schedule 27.11.2017
comment
Столбец B - мой желаемый результат   -  person ykl    schedule 27.11.2017


Ответы (1)


У тебя почти получилось. Вот небольшое редактирование вашей трубы. Это то, чего вы добивались?

df <- df %>% 
 group_by(ID) %>% 
 mutate(B1=ifelse("Yes" %in% A, "Yes", "No"))
df
person user2602640    schedule 27.11.2017
comment
Это хороший ответ +1. Обратите внимание, что технически им даже не нужно ifelse, а просто if ... else, потому что им нужно только знать, встречается ли вообще Да или нет. Так что это также может быть mutate(B1 = if(any(A == "Yes")) "Yes" else "No") - person talat; 27.11.2017
comment
Спасибо за ответ, и спасибо за уточнение! - person ykl; 27.11.2017