可变行大小的 Rbind 不提供 NA
Rbind in variable row size not giving NA's
初始数据帧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
或者,如果有人可以推荐一种更好的方法来格式化先验算法实现,那就太好了。
请帮助。
你可以试试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>
或来自 tidyr
的 separate
(由@David Arenburg 提供)
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)
)
lst <- strsplit(mergedDf$PROD_CODE, ',')
res <- do.call(rbind.data.frame,lapply(lst, `length<-`, max(lengths(lst))))
names(res) <- paste0("X", 1:4)
res
# 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>
初始数据帧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
或者,如果有人可以推荐一种更好的方法来格式化先验算法实现,那就太好了。 请帮助。
你可以试试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>
或来自 tidyr
的 separate
(由@David Arenburg 提供)
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)
)
lst <- strsplit(mergedDf$PROD_CODE, ',')
res <- do.call(rbind.data.frame,lapply(lst, `length<-`, max(lengths(lst))))
names(res) <- paste0("X", 1:4)
res
# 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>