我想拆分一列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
答案 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