R 创建一列以指示其他列中是否存在值

R 创建一列以指示其他列中是否存在值,r,tidyverse,R,Tidyverse,我有一个症状为20+的数据集,症状分类为是/否/未知。我想创建一个新的列,指出如果主题ID没有症状,我将用“是”来定义,因为他们没有症状 我在下面有一个示例数据集,我可以根据需要创建一个列,但感觉必须有一种更好/更干净的方法,只使用dplyr::mutate,而不是我正在进行的过滤和连接 图书馆弹琴 测试% 筛选器_atvarscol1:col3,任意_vars.==是%>% 变异症状=是%>% selectID,任何症状, by=ID %>% 变异症状=重新记录症状,.缺失=否 >一个tibb

我有一个症状为20+的数据集,症状分类为是/否/未知。我想创建一个新的列,指出如果主题ID没有症状,我将用“是”来定义,因为他们没有症状

我在下面有一个示例数据集,我可以根据需要创建一个列,但感觉必须有一种更好/更干净的方法,只使用dplyr::mutate,而不是我正在进行的过滤和连接

图书馆弹琴 测试% 筛选器_atvarscol1:col3,任意_vars.==是%>% 变异症状=是%>% selectID,任何症状, by=ID %>% 变异症状=重新记录症状,.缺失=否 >一个tibble:10x5 >ID col1 col2 col3有任何症状吗 > >1 1未知编号 >2 2未知否否否 >3是是未知是 >4没有未知的 >5没有未知的没有 >6未知是未知是 >7是未知未知未知是 >8不不不不 >9无未知未知无 >10不不不不 由v0.3.0于2020年5月29日创建,您可以使用行和检查一行中是否有超过0个是

test$any_symptoms <- c('No', 'Yes')[(rowSums(test[-1] == 'Yes') > 0) + 1]
或者使用purrr中的pmap

这应该起作用:

test %>% 
  left_join(
    test %>% 
      pivot_longer(-ID) %>% 
      group_by(ID) %>% 
      mutate(is_yes = value == "Yes") %>% 
      summarise(any_symptoms = ifelse(sum(is_yes) > 0, "Yes", "No"))
  )

这是可行的,但如果有20列,可能会有点烦人:

test %>% mutate(any_symptoms = case_when(grepl("Yes", paste(col1, col2, col3), fixed = TRUE) ~ "Yes", TRUE ~ "No"))
test %>% 
  left_join(
    test %>% 
      pivot_longer(-ID) %>% 
      group_by(ID) %>% 
      mutate(is_yes = value == "Yes") %>% 
      summarise(any_symptoms = ifelse(sum(is_yes) > 0, "Yes", "No"))
  )
test %>% mutate(any_symptoms = case_when(grepl("Yes", paste(col1, col2, col3), fixed = TRUE) ~ "Yes", TRUE ~ "No"))