我需要操作以下数据框(数据),以便将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 ...
答案 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"