R - 将列文本拆分为2列而不使用分隔符

时间:2014-07-14 16:06:07

标签: r

我需要操作以下数据框(数据),以便将PATCH_CODE列拆分为2个结果列,其中第1列包含字符串的字母,第2列包含数字,如下面的第2个示例数据框中所示。

编辑 PATCH_CODE并不总是2个字母,偶尔的情况只有一个字母,在这种情况下,我需要强制将1放入生成的代码列中。

初始数据框:head(data,4)

PATCH_CODE    TERR        PC1  
    A1       MENS_10  0.8629186  
    A3       MENS_10 -0.2703238 
    B1       MENS_10  0.9516067  
    B2       MENS_10 -0.1722446

结果数据框:

PATCH        CODE    TERR        PC1  
   A            1     MENS_10     0.8629186  
   A            3     MENS_10    -0.2703238 
   B            1     MENS_10     0.9516067  
   B            2     MENS_10    -0.1722446

我已经看到了当要拆分的列具有可识别的文本分隔符(例如逗号)时使用colsplit中的reshape来完成此操作的示例,但我未能找到解决方案像我的结构。这可能吗?

输出str(数据)

'data.frame':   240 obs. of  3 variables:
 $ PATCH_CODE: Factor w/ 42 levels "A","A1","A2",..: 2 3 4 7 8 12 13 16 17 18 ...
 $ TERR      : Factor w/ 19 levels "MENS_10","MENS_14",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ PC1       : num  0.548 1.228 0.273 5.548 3.853 ...

2 个答案:

答案 0 :(得分:3)

您可以使用strsplit。将空字符串作为分隔符传递会导致每个字母分开。

a <- c("A1", "B1", "C2", "D5", "R3")
strsplit(a, "")


[[1]]
[1] "A" "1"

[[2]]
[1] "B" "1"

[[3]]
[1] "C" "2"

[[4]]
[1] "D" "5"

[[5]]
[1] "R" "3"

如果你想把它放在矩阵中

> do.call(rbind, strsplit(a, ""))
     [,1] [,2]
[1,] "A"  "1" 
[2,] "B"  "1" 
[3,] "C"  "2" 
[4,] "D"  "5" 
[5,] "R"  "3" 

答案 1 :(得分:1)

根据您的描述,strsplit应该可以正常工作。如果您的数据稍微复杂一些,您还可以查看可能基于regex的解决方案。

对于此特定示例,请尝试:

do.call(rbind, strsplit(mydf$PATCH_CODE, 
                        split = "(?<=[a-zA-Z])(?=[0-9])", 
                        perl = TRUE))
#     [,1] [,2]
# [1,] "A"  "1" 
# [2,] "A"  "3" 
# [3,] "B"  "1" 
# [4,] "B"  "2"