我正在尝试将列拆分为多个列,并使用“_”作为分隔符。我在这里尝试了解决方案:
Splitting a dataframe string column into multiple different columns
就我而言,问题似乎是“分隔”文本段的数量因行而异(范围从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")
对于这个例子,最终我希望'temp2'列在每个'_'处被分开以产生以下内容:
> Output
new1 new2 new3 new4 new5
1 TR9 0817 2 NA NA
2 TR117 1119 HI 33 NA
3 TR504 1115 Su1 Y 4
据我所知,没有遇到错误:
example$temp3<-as.character(example$temp2)
test<-strsplit(example$temp3,"_")
我是否需要使用for循环逐行执行此操作,或者是否有更优雅的解决方案?
答案 0 :(得分:2)
我们也可以使用tstrsplit
library(data.table)
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
注意:它还有type.convert
参数,可以转换为适当的类型。
cSplit
来自library(splitstackshape)
library(splitstackshape)
cSplit(example, 'temp2', '_')[,c1:=NULL][]
并使用setnames
更改列名称。
或使用read.table
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
答案 1 :(得分:1)
您可以使用 tidyr 的separate()
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
如果您希望将新列转换为适当的类型,请添加convert = TRUE
。