将列拆分为多列R.

时间:2014-06-07 19:02:22

标签: regex r split dataframe

我有一个数据框列,我需要将其拆分为3个单独的列。看起来像这样:

I:500-600
I:700-900
II:200-250

我想将其拆分为以下3列:

V1 V2 V3
I 500 600
I 700 900
II 200 250
事实证明这比我希望的要复杂一些。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:6)

您可以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

答案 1 :(得分:6)

来自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个子字符串:从开头到:,从:-,从-到结尾。每个匹配的子字符串将在结果对象中构成一个单独的列。

答案 2 :(得分:5)

其他选项包括extract

中的tidyr
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的{​​{1}}。

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

答案 3 :(得分:4)

我会从我的“splitstackshape”软件包中推荐cSplit

语法非常简单:cSplit(yourInputDataFrame, yourSplittingColumn, theDelimiters)

以下是vector的示例。如果您已经有data.tabledata.frame,则会跳过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>