Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 比较每行两列中的字符-查找不符合';不匹配_R - Fatal编程技术网

R 比较每行两列中的字符-查找不符合';不匹配

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/

我可以想出几种复杂的方法来做到这一点,但什么是最有效的?我的数据集可能有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/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相比,我的完整版本数据集..事实上,它的工作速度没有另一种方法快。事实上,它的工作速度没有另一种方法快