【问题标题】:Counting specific characters in a string, across a data frame. sapply跨数据帧计算字符串中的特定字符。应用
【发布时间】:2012-12-11 09:39:36
【问题描述】:

我在这里发现了类似的问题: Count the number of words in a string in R? 和这里 Faster way to split a string and count characters using R? 但我无法在我的示例中工作。 我有一个相当大的数据框。其中一列具有特征的基因组位置,条目的格式如下:

[hg19:2:224840068-224840089:-]
[hg19:17:37092945-37092969:-] 
[hg19:20:3904018-3904040:+]
[hg19:16:67000244-67000248,67000628-67000647:+]

我将这些元素拆分为单独的元素以获得以下内容(即,第一个条目):

hg19    2   224840068   224840089   -

但对于第四个条目,我想将其粘贴到两个单独的位置。 即

hg19:16:67000244-67000248,67000628-67000647:+]

变成

hg19    16  67000244    67000248    +
hg19    16  67000628    67000647    +

(相邻列中的所有关联数据均从原始数据中填写)

对我来说,确定哪些行需要此操作的一种简单方法是简单地计算带有逗号“,”的行,因为它们不会出现在任何其他列的任何其他文本中,除非存在多个基因组位置特征。 但是我在第一关失败了,因为 sapply 命令错误地为每个条目返回“1”。

testdat$multiple <- sapply(gregexpr(",", testdat$genome_coordinates), length)

(或)

testdat$multiple <- sapply(gregexpr("\\,", testdat$genome_coordinates), length)

    table(testdat$multiple)
    1 
    4 

使用我上面发布的示例,我希望输出为

testdat$multiple
0
0
0
1

其实在做

grep -c

在命令行中的相同数据显示我有 10 个包含“,”的条目。

使用我上面发布的示例,我希望输出是

所以最初我想让这个工作,但我也有点难以理解如何提取两个(或更多)位置并将它们放在自己的行上,填充相邻的数据。 实际上我的意图是坚持我知道的东西(在命令行上)用','out grepping行,复制文件并拆分和awk选定的列(各个文件中的第一个和第二个位置)然后cat和sort他们。如果在 R 中有更好的方法让我做到这一点,那么我会喜欢一个指针。

【问题讨论】:

  • 你能不能减少你的问题,把你的问题集中在你有什么作为输入和你期望有什么?
  • 对不起,我已经编辑了这个希望它更清晰

标签: r dataframe sapply


【解决方案1】:

gregexpr 实际上确实返回了一个长度为 1 的对象。如果您想找到匹配的行和不匹配的行,那么您需要查看返回的 ,而不是长度。匹配失败返回-1
尝试foo&lt;-sapply(testdat$genome, function(x) gregexpr(',',x)); as.logical(foo) 获取带逗号的行。

【讨论】:

  • 啊,我明白了,即使它没有找到匹配项,它也会返回一个值(我猜是 0)?非常有用,谢谢。
  • 正如我所写,它返回 -1 作为值。不要猜测什么时候可以测试:-)
猜你喜欢
  • 2014-01-30
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
相关资源
最近更新 更多