如何拆分和提取元素以获取新的data.frame

时间:2013-11-18 10:10:58

标签: r

我想拆分一列data.frame以形成一个包含两列的新data.frame,例如,谢谢!我需要一种有效的解决方法,因为原始数据集大约有10万行

         V1
         AA-11-aa
         BB-22-bb
         CC-33-cc
         DD-44-dd

成为

         V2    V3
         AA11  aa
         BB22  bb
         CC33  cc
         DD44  dd

3 个答案:

答案 0 :(得分:0)

这实现了你想要的目标

mydf <- data.frame(V1=c("AA-11-aa", "BB-22-bb", "CC-33-cc", "DD-44-dd"))

strings <- unlist(strsplit(x=as.character(mydf$V1), split="-"))
n <- nrow(mydf)
data.frame(V1=paste(strings[seq(1, length.out=n, by=3)], strings[seq(2, length.out=n,  by=3)], sep=""),
           V2=strings[seq(3, length.out=n, by=3)])

答案 1 :(得分:0)

一种可能性是使用substring和“data.table”:

library(data.table)
DT <- data.table(mydf)
DT[, c("V2", "V3") := list(sub("-", "", substring(V1, 0, 5)),
                           substring(V1, 7, 9))]
DT
#          V1   V2 V3
# 1: AA-11-aa AA11 aa
# 2: BB-22-bb BB22 bb
# 3: CC-33-cc CC33 cc
# 4: DD-44-dd DD44 dd

答案 2 :(得分:0)

这是一个使用正则表达式的解决方案。它也适用于一般情况("AA-xx-xx-xx-...-11-aa"):

transform(mydf, V2 = gsub("([A-Z]+).*\\-([0-9]+).*", "\\1\\2", V1),
                V3 = gsub(".*\\-([a-z]+)", "\\1", V1))

结果:

        V1   V2 V3
1 AA-11-aa AA11 aa
2 BB-22-bb BB22 bb
3 CC-33-cc CC33 cc
4 DD-44-dd DD44 dd