我在一个数据帧中有以下变量
test<-data.frame(x=c("", "1-7-9", "3", "2-4-6-8"))我想把它分成像这样的变量:
Var1 Var2 Var3 Var4
NA NA NA NA
1 7 9
3 NA NA NA
2 4 6 8我试过了
test2<-strsplit(as.character(vartest$x), "\\-") 但是我得到了一个列表而不是一个数据帧
请帮帮我
发布于 2015-03-26 08:20:16
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.5。type.convert参数和因子到字符的转换已经在每个#1094的最新开发版本中实现了(感谢Arun!)。
或
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()获取数据帧非常困难
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发布于 2015-03-26 08:28:44
其他一些选项
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和(部分使用您的解决方案-尽管类型不受保证)
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版本
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发布于 2015-03-26 08:32:46
这是一次基本尝试,尽管它无法用NA填充第一行,而且一些测试表明它永远不会将空字符项转换为NA行。
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 8https://stackoverflow.com/questions/29268941
复制相似问题