【问题标题】:Rbind in variable row size not giving NA's [duplicate]可变行大小的 Rbind 不给出 NA [重复]
【发布时间】:2015-06-22 18:28:54
【问题描述】:

初始数据框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 算法实现,那就太好了。 请帮忙。

【问题讨论】:

    标签: r rbind


    【解决方案1】:

    你可以试试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>
    

    或来自tidyrseparate(由@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>
    

    或者用strsplitlengths函数是在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>
    

    【讨论】:

    • 那个length&lt;- 位很奇怪。可惜还没有lengths(lst) &lt;- max(lengths(lst))
    • @Frank 是的,这有点神秘。希望下一个 R 版本会变得更好。
    • lengths 获取每个列表元素的长度。在这种情况下,它是lst。它相当于sapply(lst, length),但速度更快
    • 这是一个有用的补充。感谢您的精彩回答!
    • 也可能是stringi::stri_split_fixed(mergedDf$PROD_CODE, ",", simplify = TRUE)tidyr::separate(mergedDf, PROD_CODE, 1:4, extra = "merge"),虽然不够健壮
    猜你喜欢
    • 2016-07-24
    • 2021-08-02
    • 2013-07-26
    • 1970-01-01
    • 2013-01-04
    • 2017-08-03
    • 1970-01-01
    • 2021-04-07
    • 2014-05-05
    相关资源
    最近更新 更多