首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中的变量中拆分字符串变量(非矩形)

如何在R中的变量中拆分字符串变量(非矩形)
EN

Stack Overflow用户
提问于 2015-03-26 08:16:17
回答 4查看 268关注 0票数 2

我在一个数据帧中有以下变量

代码语言:javascript
复制
test<-data.frame(x=c("", "1-7-9", "3", "2-4-6-8"))

我想把它分成像这样的变量:

代码语言:javascript
复制
Var1 Var2 Var3 Var4
NA   NA   NA   NA
1    7    9
3    NA   NA   NA
2    4    6   8

我试过了

代码语言:javascript
复制
 test2<-strsplit(as.character(vartest$x), "\\-")  

但是我得到了一个列表而不是一个数据帧

请帮帮我

EN

回答 4

Stack Overflow用户

发布于 2015-03-26 08:20:16

代码语言:javascript
复制
library(data.table)
setDT(test)[, tstrsplit(x, "-", type.convert = TRUE, fixed = TRUE)]
#    V1 V2 V3 V4
# 1: NA NA NA NA
# 2:  1  7  9 NA
# 3:  3 NA NA NA
# 4:  2  4  6  8

注:data.table dev version 1.9.5type.convert参数和因子到字符的转换已经在每个#1094的最新开发版本中实现了(感谢Arun!)。

代码语言:javascript
复制
splitstackshape::cSplit(test, "x", "-")
#    x_1 x_2 x_3 x_4
# 1:  NA  NA  NA  NA
# 2:   1   7   9  NA
# 3:   3  NA  NA  NA
# 4:   2   4   6   8

它们都返回数据表,可以通过分配结果然后使用setDF()将其转换回数据帧。它们还将数字字符正确地转换为已分类的“整型”列。

为了好玩,使用scan()获取数据帧非常困难

代码语言:javascript
复制
x <- as.character(test$x)
v <- max(vapply(strsplit(x, "-", fixed = TRUE), length, 1L))
s <- scan(text = x, what = as.list(integer(v)), sep = "-", fill = TRUE, 
    na.strings = "", blank.lines.skip = FALSE)
setNames(data.frame(s), make.names(seq_along(s)))
#   X1 X2 X3 X4
# 1 NA NA NA NA
# 2  1  7  9 NA
# 3  3 NA NA NA
# 4  2  4  6  8
票数 5
EN

Stack Overflow用户

发布于 2015-03-26 08:28:44

其他一些选项

代码语言:javascript
复制
library(tidyr) 
separate(test, x, paste0("Var", 1:4), extra = "merge", convert = TRUE)
#   Var1 Var2 Var3 Var4
# 1   NA   NA   NA   NA
# 2    1    7    9   NA
# 3    3   NA   NA   NA
# 4    2    4    6    8

和(部分使用您的解决方案-尽管类型不受保证)

代码语言:javascript
复制
library(stringi)
data.frame(stri_list2matrix(strsplit(as.character(test$x), "-", fixed = TRUE), byrow = TRUE)) 
#    X1   X2   X3   X4
# 1 <NA> <NA> <NA> <NA>
# 2    1    7    9 <NA>
# 3    3 <NA> <NA> <NA>
# 4    2    4    6    8

或者(由@Richard贡献)上述文档的完整stringi版本

代码语言:javascript
复制
data.frame(stri_split_fixed(test$x, "-", simplify = NA, omit_empty = NA))
#     X1   X2   X3   X4
# 1 <NA> <NA> <NA> <NA>
# 2    1    7    9 <NA>
# 3    3 <NA> <NA> <NA>
# 4    2    4    6    8
票数 3
EN

Stack Overflow用户

发布于 2015-03-26 08:32:46

这是一次基本尝试,尽管它无法用NA填充第一行,而且一些测试表明它永远不会将空字符项转换为NA行。

代码语言:javascript
复制
dat <- read.table(text=as.character(test$x), sep="-", 
                   fill =TRUE,col.names=paste0("Var", 1:4) )
> dat
  Var1 Var2 Var3 Var4
1    1    7    9   NA
2    3   NA   NA   NA
3    2    4    6    8
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29268941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档