【问题标题】:R Summarize"Yes" if all columns are "Yes"如果所有列都是“是”,则 R 总结“是”
【发布时间】:2022-06-15 23:40:17
【问题描述】:

我有一个如下所示的数据集:

data <- data.frame(Subject = c("A","B","C"),
          Col1 = c("Yes", "Yes", "No"),
          Col2 = c("Yes", "Yes", "Yes"),
          Col3 = c("Yes", "Yes", "Yes")
                   )

print(data)

 Subject Col1 Col2 Col3
1       A  Yes  Yes  Yes
2       B  Yes  Yes  Yes
3       C   No  Yes  Yes

我想总结是否所有列都等于“是”。如果是,则新列是“是”,如果其中一列是NA 或“否”,那么摘要列是“否”。

我当前的代码看起来像这样,但我觉得有一种更简单的方法:

data %>%
group_by(Subject) %>%
summarize(Summary = case_when(
    Col1 == "Yes & Col2 == "Yes & Col3 == "Yes ~ "Yes",
    Col1 != "Yes & Col2 != "Yes & Col3 != "Yes ~ "No",
    TRUE ~ NA

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    data %>%
      mutate(newcol = rowSums(select(cur_data(), starts_with("Col")) != "Yes") == 0)
    #   Subject Col1 Col2 Col3 newcol
    # 1       A  Yes  Yes  Yes   TRUE
    # 2       B  Yes  Yes  Yes   TRUE
    # 3       C   No  Yes  Yes  FALSE
    

    这为您提供了一个简单的logical 列,通常当列是类似真值的属性时,我更喜欢logical。但是,如果您希望它是文字字符串,那么

    data %>%
      mutate(newcol = if_else(rowSums(select(cur_data(), starts_with("Col")) != "Yes") == 0, "Yes", "No"))
    #   Subject Col1 Col2 Col3 newcol
    # 1       A  Yes  Yes  Yes    Yes
    # 2       B  Yes  Yes  Yes    Yes
    # 3       C   No  Yes  Yes     No
    

    【讨论】:

      【解决方案2】:

      我们可能会使用if_all/if_any

      library(dplyr)
      data %>% 
       mutate(Summary = case_when(if_all(starts_with("Col"), 
           ~. == "Yes") ~ "Yes", TRUE ~ "No"))
      

      -输出

       Subject Col1 Col2 Col3 Summary
      1       A  Yes  Yes  Yes     Yes
      2       B  Yes  Yes  Yes     Yes
      3       C   No  Yes  Yes      No
      

      【讨论】:

      • 很好地使用了if_all,我还没有将它们融入我的日常习惯中。
      猜你喜欢
      • 2022-01-12
      • 2019-07-15
      • 2021-02-20
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多