首页 > 解决方案 > 将数据框中的分隔值拆分为 R 中的多维数组

问题描述

我有一个数据框,其中一些单元格有数字,其他单元格有 NA,而其他单元格有多个用逗号分隔的数字(由于逗号,所有值都是字符类)。我想将具有多个逗号分隔数字的单元格中的值“推送”到一个新层中,但保留它们的列/行位置以创建一个多维数组,每个单元格中只有一个数字,其余的则填充 NA。

示例输入:

         col1           col2 col3
row1      814             NA   NA
row2 814,9732           7245 4928
row3       NA 4921,8288,4923   NA

期望的输出:

, , 1

     [,1]  [,2]   [,3]  
[1,] "814" "NA"   "NA"  
[2,] "814" "7245" "4928"
[3,] "NA"  "4921" "NA"  

, , 2

     [,1]   [,2]   [,3]
[1,] "NA"   "NA"   "NA"
[2,] "9732" "NA"   "NA"
[3,] "NA"   "8288" "NA"

, , 3

     [,1] [,2]   [,3]
[1,] "NA" "NA"   "NA"
[2,] "NA" "NA"   "NA"
[3,] "NA" "4923" "NA"

我已经尝试过使用一个版本,lapply(my.df, function(x) strsplit(x, ","))但它导致了一个奇怪的数据帧内列表结构,我无法弄清楚如何解析。

标签: arraysrdataframesplit

解决方案


有趣的问题。我觉得必须有更好的方法来做到这一点,但这有效:

library(abind)

dflist <- lapply(df, strsplit, ',')
maxlen <- max(sapply(dflist, lengths))

out <- lapply(seq_len(maxlen), 
              function(i) sapply(dflist, function(x) sapply(x, `[`, i)))

do.call(abind, c(out, along = 3))

输出:

, , 1

     col1  col2   col3  
[1,] "814" NA     NA    
[2,] "814" "7245" "4928"
[3,] NA    "4921" NA    

, , 2

     col1   col2   col3
[1,] NA     NA     NA  
[2,] "9732" NA     NA  
[3,] NA     "8288" NA  

, , 3

     col1 col2   col3
[1,] NA   NA     NA  
[2,] NA   NA     NA  
[3,] NA   "4923" NA  

使用的数据:

df <- fread("
         col1           col2 col3
row1      814             NA   NA
row2 814,9732           7245 4928
row3       NA 4921,8288,4923   NA
")[, -1, with = F]
df[, col3 := as.character(col3)]
setDF(df)

推荐阅读