【发布时间】:2014-07-28 19:58:54
【问题描述】:
我有一个数据框列,我需要将其拆分为 3 个单独的列。看起来像这样:
I:500-600
I:700-900
II:200-250
我想把它分成以下 3 列:
V1 V2 V3
I 500 600
I 700 900
II 200 250
事实证明,这比我希望的要复杂一些。任何帮助将不胜感激。
【问题讨论】:
我有一个数据框列,我需要将其拆分为 3 个单独的列。看起来像这样:
I:500-600
I:700-900
II:200-250
我想把它分成以下 3 列:
V1 V2 V3
I 500 600
I 700 900
II 200 250
事实证明,这比我希望的要复杂一些。任何帮助将不胜感激。
【问题讨论】:
其他选项包括来自tidyr的extract
library(tidyr)
extract(df1, V1, into=c('V1','V2', 'V3'),
'([^:]*):([0-9]*)-([0-9]*)', convert=TRUE)
# V1 V2 V3
#1 I 500 600
#2 I 700 900
#3 II 200 250
或tstrsplit 来自data.table。
library(data.table)#v1.9.5+
setDT(df1)[, tstrsplit(V1, '[:-]', type.convert=TRUE)]
# V1 V2 V3
#1: I 500 600
#2: I 700 900
#3: II 200 250
注意:这两个选项都有参数来转换输出列的类
df1 <- structure(list(V1 = c("I:500-600", "I:700-900", "II:200-250")),
.Names = "V1", class = "data.frame", row.names = c(NA, -3L))
【讨论】:
data.table 国王。
我会从我的“splitstackshape”包中推荐cSplit。
语法非常简单:cSplit(yourInputDataFrame, yourSplittingColumn, theDelimiters)。
这是vector 的示例。如果您已经有 data.frame 或 data.table,则可以跳过 data.table 部分。
library(splitstackshape)
cSplit(data.table(x), "x", ":|-", fixed = FALSE)
# x_1 x_2 x_3
# 1: I 500 600
# 2: I 700 900
# 3: II 200 250
默认也运行type.convert:
str(.Last.value)
# Classes ‘data.table’ and 'data.frame': 3 obs. of 3 variables:
# $ x_1: Factor w/ 2 levels "I","II": 1 1 2
# $ x_2: int 500 700 200
# $ x_3: int 600 900 250
# - attr(*, ".internal.selfref")=<externalptr>
【讨论】:
您可以将strsplit 与使用: 或- 的OR 参数拆分一起使用,这将为您提供一个可以进一步处理的列表。
> test <- c('I:500-600', 'I:700-900', 'II:200-250')
> do.call(rbind.data.frame, strsplit(test, ":|-"))
c..I....I....II.. c..500....700....200.. c..600....900....250..
1 I 500 600
2 I 700 900
3 II 200 250
如果名字很重要
> as.data.frame(do.call(rbind, strsplit(test, ":|-")))
V1 V2 V3
1 I 500 600
2 I 700 900
3 II 200 250
【讨论】:
str_match 的另一个解决方案来自stringr 包:
x <- c("I:500-600", "I:700-900", "II:200-250")
library(stringr)
as.data.frame(str_match(x, "^(.*):(.*)-(.*)$")[,-1])
## V1 V2 V3
## 1 I 500 600
## 2 I 700 900
## 3 II 200 250
在上面的正则表达式中,我们匹配3个子字符串:从开头到:,从:到-,从-到结尾。每个匹配的子字符串将在结果对象中构成一个单独的列。
【讨论】: