繁体   English   中英

如何使用dplyr比较多个变量

[英]How to compare multiple variables using dplyr

目前,我需要一种方法来分析我拥有的数据,如果您能与我合作,将会有很大帮助。 数据如下例所示:

> glimpse(test)
Rows: 559
Columns: 4
$ Host.H <chr> "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Hu…
$ Host.I <chr> NA, "Intermediate", "Intermediate", "Intermediate", "Intermediate", "Intermediate", "Intermediate", "Intermedia…
$ Host.B <chr> NA, "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", NA, "Bat", "Bat"…
$ Host.C <chr> NA, "Consensus", "Consensus", "Consensus", "Consensus", "Consensus", "Consensus", "Consensus", "Consensus", "Co…

这些数据对应于蝙蝠、中间体、人类和复制品(Host.B、Host.I、Host.H 和 Host.C)衍生的生物。 可以发现它们并不是在所有单元格中都是完整的,有一些数据不可用作为 NA 因此,我的目标是,如果在所有变量中(Host.B = Bat, Host.I = Intermediate , Host.H = Human and Host. C = Consensus)它被分配到一个名为“type”的新列作为“Conserved”,而如果变量中缺少数据(Host.B = NA, Host.I = Intermediate , Host.H = NA and Host.C = Consensus)它被标识为“共享”,如果列中只有一个数据(Host.B = Bat, Host.I = NA, Host.H = NA and Host .C = NA) 为“唯一”。

为此,我设计了以下脚本:

test <- data %>%
  rowwise() %>%
  mutate(Type = case_when(
    all_eq(c(Host.H = Human, Host.C = Consensus, Host.B = Bat, Host.I = Intermediate), na.rm = T ~ "Conserved",
    all_neq(c(Host.H = Human, Host.C = Consensus, Host.B = Bat, Host.I = Intermediate), na.rm = T)) ~ "Unique",
    TRUE ~ "Shared"
  )) %>%
  ungroup()

不幸的是,它对我需要的目标不起作用。 因此,如果您有更可行的方法来执行此操作,将不胜感激。

谢谢。

您可以使用rowSums来计算数据帧中非 NA 值的数量。 根据该count您可以分配Type列。

library(dplyr)

test <- test %>%
  mutate(count = rowSums(!is.na(.[c('Host.H', 'Host.I', 'Host.B', 'Host.C')])), 
         Type = case_when(count == 4 ~ 'Conserved', 
                          count > 1 ~ 'Shared', 
                          count == 1 ~ 'Unique'))

您可以通过包含%>% select(-count)从输出中删除count列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM