如何创建一个新列来显示是否以及有多少变量共享特定的观察结果
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
我们可以使用 Reduce
和 lapply
df1$X <- Reduce(`+`, lapply(df1[2:4], `>`, 0))
df1$X
#[1] 3 2 3 1 2 2 1 2 2
Reduce
可以非常有效,如基准测试
所示
我有一个关于在 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
我们可以使用 Reduce
和 lapply
df1$X <- Reduce(`+`, lapply(df1[2:4], `>`, 0))
df1$X
#[1] 3 2 3 1 2 2 1 2 2
Reduce
可以非常有效,如基准测试