[英]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.