在数据框中计算字符串中的特定字符。 sapply

时间:2012-12-11 09:39:37

标签: r grep dataframe sapply

我在这里发现了类似的问题: 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来重写行,复制文件并拆分和awk选择的列(相应文件中的第一个和第二个位置)然后cat and sort他们。如果我在R中有一个更快的方式,那么我会喜欢指针。

1 个答案:

答案 0 :(得分:0)

实际上

gregexpr会返回长度为1的对象。如果要查找匹配的行与不匹配的行,则需要查看返回的值< / em>,而不是长度。匹配失败返回-1 尝试使用foo<-sapply(testdat$genome, function(x) gregexpr(',',x)); as.logical(foo)获取带逗号的行。