如何根据R中列中的字母和数字字符对象在data.frame中创建新列

时间:2015-10-09 18:16:47

标签: r substring strpos desctools

我有一个数据框,其中一列填充了这样的数据,在染色体上,然后是基本位置,都在一列中。我使用整数填充剩余的V2到V5列,只是为了模拟类似的data.frame。

> test
             V1 V2 V3 V4 V5
1     I.1286480  9 17 25 33
2     I.1898932 10 18 26 34
3    I.11871397 11 19 27 35
4    II.1252994 12 20 28 36
5   II.18175911 13 21 29 37
6  III.10298347 14 22 30 38
7  IV.123478912 15 23 31 39
8 V.12837471234 16 24 32 40

以下列中的其他数据。这是一个巨大的数据集,有115,000行。我想制作两个新列,一个包含罗马数字(I,II,III,IV,V),另一列包含罗马数字后面的数字。我遇到问题的问题是这是一个字符对象的向量,所以我不确定如何解析数字中的字母。我尝试使用DescTools包中的StrPos,但是

> StrPos(test$V1, "I")
[1]  1  1  1  1  1  1  1 NA
> StrPos(test$V1, "I.")
[1]  1  1  1  1  1  1  1 NA

它返回所有" I" s的位置,而不仅仅是具有" I"的一个实例的对象。我想知道substring是否有效?但后来我遇到了所有罗马数字长度不同的问题,以及罗马数字后面的数字也有不同的长度。我知道必须有一个简单的解决方案来解决这个问题,但我能想到的唯一问题是非常长的forif循环。帮助我,stackoverflow,你是我唯一的希望!

1 个答案:

答案 0 :(得分:5)

使用separate中的tidyr

library(tidyr)
separate(test, V1, into = c("chr", "pos"))
  chr         pos V2 V3 V4 V5
1   I     1286480  9 17 25 33
2   I     1898932 10 18 26 34
3   I    11871397 11 19 27 35
4  II     1252994 12 20 28 36
5  II    18175911 13 21 29 37
6 III    10298347 14 22 30 38
7  IV   123478912 15 23 31 39
8   V 12837471234 16 24 32 40