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



我有一个问题,即在r。

中对某些生物信息学数据进行分析

我的测试数据框架由一个可变的"序列"组成,其中具有不同的字母代码为观察值和三个代表个体/样本的不同变量(P1,P2,P3),该变量表明在一个个体中计数特定观察值的频率(因此P3例如,包含序列" AB" 23次)。我想现在创建一个新列(在我的数据框架中已指定为带有na的虚拟列x),该列显示每个序列行总体共享的序列(p1,p2,p3),更重要的是多少三个人共享。因此,新列中的数字只能在1到3范围3。例如:对于序列" ABCDE",新列将显示值1,因为它仅在一个单独的P3中发生,对于序列" ABC",新列将显示值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可以非常有效,如此处的基准测试中所示

最新更新