将列拆分为多个列 R

4

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

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

我希望将这个分成以下三列:
V1 V2 V3
I 500 600
I 700 900
II 200 250

这证明比我预期的要稍微棘手一些。任何帮助都将不胜感激。
4个回答

7
< p >使用stringr包中的str_match函数可以得到另一种解决方案:

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

6
其他选项包括使用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

或者使用来自data.table的tstrsplit函数。
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))

akrun,data.table之王。 - AOE_player

6
你可以使用strsplit函数,同时指定以:或者-作为分隔符,这样会返回一个列表,你可以进一步处理该列表。
> 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

4
我会推荐使用我自己的“splitstackshape”包中的函数进行拆分。语法非常简单:。这里有一个在向量上的例子,如果你已经有了一个数据框或数据表,你可以跳过部分。
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> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接