如何创建一个新列来显示是否以及有多少变量共享特定的观察结果

How to create a new column showing if and how many variables share a specific observation

我有一个关于在 R 中分析一些生物信息学数据的问题。

我的测试数据框由一个变量 "sequence" 组成,变量 "sequence" 具有不同的字母代码作为观察值,三个不同的变量代表 individuals/samples (P1,P2,P3),表示特定观察值的计数频率在个人中(例如 P3 包含序列 "AB" 23 次)。 我现在想创建一个新列(已在我的数据框中指示为带有 NA 的虚拟列 X),如果序列在个人(P1、P2、P3)之间整体共享,则显示每个序列行,更重要的是有多少三个人分享。因此,新列中的数字只能介于 1 到 3 之间。例如:对于序列 "ABCDE",新列将显示值 1,因为它仅出现在一个单独的 P3 中,对于序列 "ABC",新列将显示值 1。列将显示值 2,因为它出现在个人 P2 和 P3 中,最后对于 "ABCD" 它将显示 3,因为所有个人都包含该序列。

我的测试数据在 dput() 之后是这样的:

structure(list(Sequence = structure(1:9, .Label = c("AB", "ABC", 
"ABCD", "ABCDE", "ABCDEF", "ABCDEFG", "ABCDEFGH", "ABCDEFGHI", 
"ABCDEFGHIJ"), class = "factor"), P1 = c(5L, 0L, 20L, 0L, 3L, 
1L, 0L, 0L, 0L), P2 = c(6L, 2L, 3L, 0L, 2L, 0L, 56L, 10L, 3L), 
    P3 = c(23L, 34L, 8L, 5L, 0L, 6L, 0L, 78L, 5L), X = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("Sequence", 
"P1", "P2", "P3", "X"), class = "data.frame", row.names = c(NA, 
-9L))

谢谢!

您可以尝试用正计数对 "P." 列求和:

mydf$X <- rowSums(mydf[, grep("^P", names(mydf))]>0)

 head(mydf, 4)
#  Sequence P1 P2 P3 X
#1       AB  5  6 23 3
#2      ABC  0  2 34 2
#3     ABCD 20  3  8 3
#4    ABCDE  0  0  5 1

我们可以使用 Reducelapply

df1$X <- Reduce(`+`, lapply(df1[2:4], `>`, 0))
df1$X
#[1] 3 2 3 1 2 2 1 2 2

Reduce 可以非常有效,如基准测试

所示