可变行大小的Rbind不给NA

时间:2015-06-22 18:28:54

标签: r rbind

初始数据框mergedDf

  PROD_CODE
  1 PRD0900033,PRD0900135,PRD0900220,PRD0900709
  2                       PRD0900097,PRD0900550
  3                                  PRD0900121
  4                                  PRD0900353
  5                       PRD0900547,PRD0900614

致电后

mergedDf<-data.frame(do.call('rbind', strsplit(as.character(mergedDf$PROD_CODE),',',fixed=TRUE)))

输出变为

 X1         X2         X3         X4
1 PRD0900033 PRD0900135 PRD0900220 PRD0900709
2 PRD0900097 PRD0900550 PRD0900097 PRD0900550
3 PRD0900121 PRD0900121 PRD0900121 PRD0900121
4 PRD0900353 PRD0900353 PRD0900353 PRD0900353
5 PRD0900547 PRD0900614 PRD0900547 PRD0900614

似乎多余的行正在重新填充。

我尝试使用bind_rows()rbind_all(),但这些需要将已拆分的更改为data.frame,这是我无法做到的。我也尝试使用rbindlist(),它还需要data.frame作为参数。

我需要输出。这些职位并不重要。

  X1         X2         X3         X4
1 PRD0900033 PRD0900135 PRD0900220 PRD0900709
2 PRD0900097 PRD0900550 NA         NA
3 PRD0900121 NA         NA         NA
4 PRD0900353 NA         NA         NA
5 PRD0900547 PRD0900614 NA         NA

或者,如果有人可以推荐一种更好的格式化apriori算法实现的方法,那就太好了。 请帮助。

1 个答案:

答案 0 :(得分:7)

您可以尝试cSplit

library(splitstackshape)
setnames(cSplit(mergedDf, 'PROD_CODE', ','), paste0('X',1:4))[]
#           X1         X2         X3         X4
#1: PRD0900033 PRD0900135 PRD0900220 PRD0900709
#2: PRD0900097 PRD0900550         NA         NA
#3: PRD0900121         NA         NA         NA
#4: PRD0900353         NA         NA         NA
#5: PRD0900547 PRD0900614         NA         NA

或使用data.table的开发版,即v1.9.5

library(data.table)
setDT(mergedDf)[, tstrsplit(PROD_CODE, ',', fixed=TRUE)]
#           V1         V2         V3         V4
#1: PRD0900033 PRD0900135 PRD0900220 PRD0900709
#2: PRD0900097 PRD0900550         NA         NA
#3: PRD0900121         NA         NA         NA
#4: PRD0900353         NA         NA         NA
#5: PRD0900547 PRD0900614         NA         NA

或使用stringi(由@David Arenburg提供)

library(stringi)
d1 <- as.data.frame(stri_split_fixed(mergedDf$PROD_CODE, ",", simplify = TRUE))
is.na(d1) <- d1==''
d1
#          V1         V2         V3         V4
#1 PRD0900033 PRD0900135 PRD0900220 PRD0900709
#2 PRD0900097 PRD0900550       <NA>       <NA>
#3 PRD0900121       <NA>       <NA>       <NA>
#4 PRD0900353       <NA>       <NA>       <NA>
#5 PRD0900547 PRD0900614       <NA>       <NA>

来自separate的{​​{1}}(由@David Arenburg提供)

tidyr

或使用 library(tidyr) separate(mergedDf, PROD_CODE, 1:4, extra = "merge") #note the extra='merge' # 1 2 3 4 #1 PRD0900033 PRD0900135 PRD0900220 PRD0900709 #2 PRD0900097 PRD0900550 <NA> <NA> #3 PRD0900121 <NA> <NA> <NA> #4 PRD0900353 <NA> <NA> <NA> #5 PRD0900547 PRD0900614 <NA> <NA>

base R

read.table(text=mergedDf$PROD_CODE, sep=",", col.names=paste0("X",1:4), fill=TRUE, na.strings='', stringsAsFactors=FALSE) # X1 X2 X3 X4 #1 PRD0900033 PRD0900135 PRD0900220 PRD0900709 #2 PRD0900097 PRD0900550 <NA> <NA> #3 PRD0900121 <NA> <NA> <NA> #4 PRD0900353 <NA> <NA> <NA> #5 PRD0900547 PRD0900614 <NA> <NA> strsplit中引入了lengths函数。早期版本的等效代码为R 3.2.0

sapply(lst, length)