R 比较每行两列中的字符-查找不符合';不匹配
我可以想出几种复杂的方法来做到这一点,但什么是最有效的?我的数据集可能有10000多行 样本数据:R 比较每行两列中的字符-查找不符合';不匹配,r,R,我可以想出几种复杂的方法来做到这一点,但什么是最有效的?我的数据集可能有10000多行 样本数据: example = structure(list(set = structure(c(2L, 2L, 7L, 11L, 11L, 2L, 2L, 6L, 11L, 12L), .Names = c("87", "89", "90", "91", "92", "93", "563", "564", "565", "95"), .Label = c("A/C", "A/G", "A/T", "C/
example = structure(list(set = structure(c(2L, 2L, 7L, 11L, 11L, 2L, 2L,
6L, 11L, 12L), .Names = c("87", "89", "90", "91", "92", "93",
"563", "564", "565", "95"), .Label = c("A/C", "A/G", "A/T", "C/A",
"C/G", "C/T", "G/A", "G/C", "G/T", "T/A", "T/C", "T/G"), class = "factor"),
line1 = c("G", "G", "A", "C", "C", "A", "A", "T", "C", "G"
), line2 = c("A", "A", "G", "T", "T", "G", "G", "C", "T",
"A")), .Names = c("set", "line1", "line2"), row.names = c(5L,
7L, 8L, 9L, 10L, 11L, 13L, 14L, 15L, 16L), class = "data.frame")
看起来像:
> example
set line1 line2
5 A/G G A
7 A/G G A
8 G/A A G
9 T/C C T
10 T/C C T
11 A/G A G
13 A/G A G
14 C/T T C
15 T/C C T
16 T/G G A
我想查找第1行和第2行中的字符不在“set”列中的行。理想输出如下:
set line1 line2 check
5 A/G G A TRUE
7 A/G G A TRUE
8 G/A A G TRUE
9 T/C C T TRUE
10 T/C C T TRUE
11 A/G A G TRUE
13 A/G A G TRUE
14 C/T T C TRUE
15 T/C C T TRUE
16 T/G G A FALSE
我想我需要将每个集合解析成一些东西。。但我有点困了。也许是这样:
strsplit(as.character(example$set), "/")
然后使用setdiff?这对您有用吗
L <- 1:dim(example)[1]
in1 <- sapply(L, function(i) length(grep(example$line1[i], example$set[i])))
in2 <- sapply(L, function(i) length(grep(example$line2[i], example$set[i])))
example$check <- in1 & in2
L这对你有用吗
L <- 1:dim(example)[1]
in1 <- sapply(L, function(i) length(grep(example$line1[i], example$set[i])))
in2 <- sapply(L, function(i) length(grep(example$line2[i], example$set[i])))
example$check <- in1 & in2
L这应该可以扩展到包括任意数量的line1/2/n变量:
with(example, mapply(
function(x,...) length(setdiff(x,c(...))) == 0,
strsplit(as.character(set),"/"),
line1,
line2
))
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
这应该可以扩展到包括任意数量的line1/2/n变量:
with(example, mapply(
function(x,...) length(setdiff(x,c(...))) == 0,
strsplit(as.character(set),"/"),
line1,
line2
))
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
您可以避免字符比较,并使用更多的数值方法与这样的策略
#create factors, set up loop up table
g <- setNames(2^((1:4)-1), c("A","C","G","T"))
gg <- setNames(
c(outer(as.numeric(g), as.numeric(g), bitwOr)),
outer(names(g), names(g), paste, sep="/")
)
您可以避免字符比较,并使用更多的数值方法与这样的策略
#create factors, set up loop up table
g <- setNames(2^((1:4)-1), c("A","C","G","T"))
gg <- setNames(
c(outer(as.numeric(g), as.numeric(g), bitwOr)),
outer(names(g), names(g), paste, sep="/")
)
T/C | T | C的检查状态是什么?T/C | T | C的检查状态是什么?是的,这就是我想要了解的。不错是的,这就是我想说的。很好,这太棒了。我第一次看到使用Bitewise逻辑运算。我希望看到代码被注释,因为我无法访问它!谢谢@PauloCardoso我试图添加更多描述,但这可能不是解决问题的最佳方式。虽然我想知道它是否比基于字符串的比较快。感谢您的支持,添加它。这比@thelatemail setdiff方法快-尽管该方法更容易解释:)用户系统运行0.030 0.008 0.035
与用户系统运行0.114 0.009 0.122相比,我的完整数据集。这这太神奇了。我第一次看到使用Bitewise逻辑运算。我希望看到代码被注释,因为我无法访问它!谢谢@PauloCardoso我试图添加更多描述,但这可能不是解决问题的最佳方式。虽然我想知道它是否比基于字符串的比较快。感谢您的支持,我添加了它。这比@thelatemail setdiff方法快-尽管该方法更容易解释:)用户系统运行0.030 0.008 0.035
与用户系统运行0.114 0.009 0.122相比,我的完整版本数据集..事实上,它的工作速度没有另一种方法快。事实上,它的工作速度没有另一种方法快