将列拆分为多列R.

use*_*284 2 regex split r dataframe

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

I:500-600
I:700-900
II:200-250
Run Code Online (Sandbox Code Playgroud)

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

V1 V2 V3
I 500 600
I 700 900
II 200 250
Run Code Online (Sandbox Code Playgroud)

事实证明这比我希望的要复杂一些.任何帮助,将不胜感激.

jdh*_*son 6

您可以使用strsplitOR参数拆分使用,:或者-这将为您提供一个可以进一步处理的列表.

> 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
Run Code Online (Sandbox Code Playgroud)

如果名字很重要

> as.data.frame(do.call(rbind, strsplit(test, ":|-")))
  V1  V2  V3
1  I 500 600
2  I 700 900
3 II 200 250
Run Code Online (Sandbox Code Playgroud)


gag*_*ews 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
Run Code Online (Sandbox Code Playgroud)

在上面的正则表达式中,我们匹配3个子串:从开始到:,从:-,从-到结尾.每个匹配的子字符串将在结果对象中构成一个单独的列.


akr*_*run 5

其他选项包括extracttidyr

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
Run Code Online (Sandbox Code Playgroud)

tstrsplitdata.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
Run Code Online (Sandbox Code Playgroud)

注意:这两个选项都具有用于转换输出列的类的参数

数据

df1 <- structure(list(V1 = c("I:500-600", "I:700-900", "II:200-250")), 
 .Names = "V1", class = "data.frame", row.names = c(NA, -3L))
Run Code Online (Sandbox Code Playgroud)