разделить разделенные значения в кадре данных на многомерный массив в R - PullRequest
0 голосов
/ 01 июня 2018

У меня есть фрейм данных, в котором у некоторых ячеек есть числа, у других - 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, ",")), но это приводит к странному результатуСтруктура списка внутри dataframe, которую я не могу понять, как разобрать.

1 Ответ

0 голосов
/ 01 июня 2018

Интересный вопрос.Я чувствую, что должен быть лучший способ сделать это, но это работает:

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)
...