在r中将不规则文本列拆分为多列

在r中将不规则文本列拆分为多列,r,string,multiple-columns,R,String,Multiple Columns,我正在尝试将一列拆分为多个列,并使用“\u1”作为分隔符。我在这里尝试了以下解决方案: 在我的例子中,问题似乎是“分隔”文本段的数量在各行之间不同(范围从3到5),因为每当我尝试拆分字符串,然后转换为矩阵或数据帧时,都会不断出错。下面是一个可以复制到R中的示例: example<-structure(list(c1 = c(1, 2, 3), temp2 = structure(c(3L, 1L, 2L ), .Label = c("TR117_1119_HI_33", "TR504_1

我正在尝试将一列拆分为多个列,并使用“\u1”作为分隔符。我在这里尝试了以下解决方案:

在我的例子中,问题似乎是“分隔”文本段的数量在各行之间不同(范围从3到5),因为每当我尝试拆分字符串,然后转换为矩阵或数据帧时,都会不断出错。下面是一个可以复制到R中的示例:

example<-structure(list(c1 = c(1, 2, 3), temp2 = structure(c(3L, 1L, 2L
), .Label = c("TR117_1119_HI_33", "TR504_1115_Su1_Y_4", "TR9_0817_2"
), class = "factor")), .Names = c("c1", "temp2"), row.names = c(NA, 
-3L), class = "data.frame")
以下是我在没有遇到错误的情况下得到的信息:

example$temp3<-as.character(example$temp2)
test<-strsplit(example$temp3,"_")
example$temp3您可以使用tidyr的
separate()

tidyr::separate(例如[-1]、temp2、paste0(“新的”,1:5)、“_u”,fill=“右”)
#新1新2新3新4新5
#1 TR9 0817 2
#2 TR117 1119 HI 33
#3 TR504 1115 Su1 Y 4

如果希望将新列转换为适当的类型,请添加
convert=TRUE

我们也可以使用
library(data.table)

注意:它还有
type.convert
参数,可以转换为适当的类型


cSplit
来自
库(splitstackshape)

并如上所述使用
setnames
更改列名


或者使用
read.table
from
base R

read.table(text=as.character(example$temp2), sep="_", na.strings='',
                stringsAsFactors=FALSE,fill=TRUE, col.names=paste0('new', 1:5))
#   new1 new2 new3 new4 new5
#1   TR9  817    2 <NA>   NA
#2 TR117 1119   HI   33   NA
#3 TR504 1115  Su1    Y    4
read.table(text=as.character(示例$temp2),sep=“”,na.strings=”,
stringsAsFactors=FALSE,fill=TRUE,col.names=paste0('new',1:5))
#新1新2新3新4新5
#1 TR9 817 2 NA
#2 TR117 1119 HI 33 NA
#3 TR504 1115 Su1 Y 4
tidyr::separate(example[-1], temp2, paste0("new", 1:5), "_", fill = "right")
#    new1 new2 new3 new4 new5
# 1   TR9 0817    2 <NA> <NA>
# 2 TR117 1119   HI   33 <NA>
# 3 TR504 1115  Su1    Y    4
library(data.table)#v1.9.6+
setnames(setDT(example)[, tstrsplit(temp2, '_')], paste0('new', 1:5))[]
#    new1 new2 new3 new4 new5
#1:   TR9 0817    2   NA   NA
#2: TR117 1119   HI   33   NA
#3: TR504 1115  Su1    Y    4
library(splitstackshape)
cSplit(example, 'temp2', '_')[,c1:=NULL][]
read.table(text=as.character(example$temp2), sep="_", na.strings='',
                stringsAsFactors=FALSE,fill=TRUE, col.names=paste0('new', 1:5))
#   new1 new2 new3 new4 new5
#1   TR9  817    2 <NA>   NA
#2 TR117 1119   HI   33   NA
#3 TR504 1115  Su1    Y    4