基于dplyr生成TRUE/FALSE列,检测Time开头列是否含指定值
需求描述
我有一个dataframe,需要检查所有以Time开头的列是否包含特定值(例如'1')。若某一行中有1个及以上符合条件的列,需生成一列包含TRUE/FALSE的结果列。优先采用dplyr解决方案。
示例dataframe的结构如下:
structure(list(Nummer = c("449002", "449003", "449005", "449006", "449010"), `Sample ID.1` = c("4490021", "4490031", "4490051", "4490061", "4490101"), Time.1 = c("1", "1", "1", "1", "1"), `Sample ID.2` = c("4490022", "4490032", "4490052", "4490062", "4490102"), Time.2 = c("2", "2", "2", "2", "2"), `Sample ID.3` = c("4490022", "4490032", "4490052", "4490062", "4490102"), Time.3 = c("2", "2", "2", "2", "2"), `Sample ID.4` = c("4490023", "4490033", "4490053", "4490063", "4490103"), Time.4 = c("3", "3", "3", "3", "3"), `Sample ID.5` = c("4490023", "4490031", "4490053", "4490063", "4490103"), Time.5 = c("3", "1", "3", "3", "3"), `Sample ID.6` = c("4490021", "4490031", "44900551", "4490061", "44901051"), Time.6 = c("1", "1", "51", "1", "51"), `Sample ID.7` = c("4490021", "4490031", "4490051", "4490061", "4490101"), Time.7 = c("1", "1", "1", "1", "1"), `Sample ID.8` = c("4490022", "4490032", "4490051", "4490062", "4490101"), Time.8 = c("2", "2", "1", "2", "1"), `Sample ID.9` = c("4490022", "4490032", "4490052", "4490062", "4490102"), Time.9 = c("2", "2", "2", "2", "2"), `Sample ID.10` = c("4490023", "4490032", "4490052", "4490063", "4490102"), Time.10 = c("3", "2", "2", "3", "2"), `Sample ID.11` = c("4490023", "4490033", "4490053", "4490063", "4490103"), Time.11 = c("3", "3", "3", "3", "3"), `Sample ID.12` = c(NA, "4490033", "4490053", NA, "4490103"), Time.12 = c(NA, "3", "3", NA, "3"), `Sample ID.13` = c(NA, "4490033", "44900551", NA, "44901051"), Time.13 = c(NA, "3", "51", NA, "51"), `Sample ID.14` = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), Time.14 = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), `Sample ID.15` = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), Time.15 = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_ ), `Sample ID.16` = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), Time.16 = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_ )), class = c("grouped_df", "tbl_df", "tbl", "data.frame" ), row.names = c(NA, -5L), groups = structure(list(Nummer = c("449002", "449003", "449005", "449006", "449010"), .rows = structure(list( 1L, 2L, 3L, 4L, 5L), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -5L), .drop = TRUE))
dplyr解决方案
可以使用dplyr的if_any()函数直接实现需求,代码简洁高效:
library(dplyr) # 假设数据框名为df,生成结果列 df_result <- df %>% mutate(has_target_value = if_any(starts_with("Time"), ~ .x == "1"))
代码说明
starts_with("Time"):精准筛选所有列名以Time开头的列~ .x == "1":对每一列的每个元素检查是否等于目标值"1"(示例中Time列为字符类型,若为数值类型可去掉引号)if_any():只要该行内任意一列满足条件,就返回TRUE,否则返回FALSEmutate():将判断结果作为新列has_target_value添加到数据框中
分组数据框处理
示例数据为分组数据框(grouped_df),上述代码会保留原有分组结构;若不需要分组,可先解除分组:
df_result <- df %>% ungroup() %>% mutate(has_target_value = if_any(starts_with("Time"), ~ .x == "1"))
结果验证
针对示例数据,生成的has_target_value列结果为TRUE, TRUE, TRUE, TRUE, TRUE,因为每一行的Time列中都至少存在一个"1"。
内容的提问来源于stack exchange,提问作者Debbie Oomen
相关产品推荐
相关产品推荐

