Подтвердить что ты не робот

Как strsplit различное количество строк в определенном столбце функцией do

У меня проблема с значением split column, когда элемент столбца имеет различное количество строк. Я могу сделать это в plyr, например:

library(plyr)
column <- c("jake", "jane jane","john john john")
df <- data.frame(1:3, name = column)
df$name <- as.character(df$name)
df2 <- ldply(strsplit(df$name, " "), rbind)
View(df2)

В результате у нас есть кадр данных с числом столбцов, связанным с максимальным количеством укусов в данном элементе.

Когда я пытаюсь сделать это в dplyr, я использовал функцию do:

library(dplyr)
df2 <- df %>%
  do(data.frame(strsplit(.$name, " ")))

но я получаю сообщение об ошибке:

Error in data.frame("jake", c("jane", "jane"), c("john", "john", "john" : 
arguments imply differing number of rows: 1, 2, 3

Мне кажется, что он должен использоваться rbind, но я не знаю, где.

4b9b3361

Ответ 1

У вас проблемы, потому что strsplit() возвращает список, который нам нужно применить as.data.frame.list() к каждому элементу, чтобы получить его в надлежащем формате, который требуется dplyr. Даже тогда это все равно потребует немного больше работы для получения полезных результатов. Короче говоря, это не похоже на подходящую операцию для do().

Думаю, вам лучше использовать separate() от tidyr. Его можно легко использовать с функциями dplyr и цепями. Не понятно, хотите ли вы сохранить первый столбец, так как ваш результат ldply для df2 не имеет его, поэтому я его не отключил.

library(tidyr)
separate(df[-1], name, 1:3, " ", extra = "merge")
#      1    2    3
# 1 jake <NA> <NA>
# 2 jane jane <NA>
# 3 john john john

Вы также можете использовать cSplit. Он также очень эффективен, поскольку он полагается на data.table

library(splitstackshape)
cSplit(df[-1], "name", " ")
#    name_1 name_2 name_3
# 1:   jake     NA     NA
# 2:   jane   jane     NA
# 3:   john   john   john

Или более конкретно

setnames(df2 <- cSplit(df[-1], "name", " "), names(df2), as.character(1:3))
df2
#       1    2    3
# 1: jake   NA   NA
# 2: jane jane   NA
# 3: john john john