2016-04-23 1 views
2

Я смущен о каком-то тидирском поведении. Я могу unnest единственный ответ, как это:tidyr: многократное раздражение с различными значениями NA

library(tidyr) 

resp1 <- c("A", "B; A", "B", NA, "B") 
resp2 <- c("C; D; F", NA, "C; F", "D", "E") 
resp3 <- c(NA, NA, "G; H; I", "H; I", "I") 
data <- data.frame(resp1, resp2, resp3, stringsAsFactors = F) 

tidy <- data %>% 
    transform(resp1 = strsplit(resp1, "; ")) %>% 
    unnest() 

# Source: local data frame [6 x 3] 
# 
#  resp2 resp3 resp1 
#  (chr) (chr) (chr) 
# 1 C; D; F  NA  A 
# 2  NA  NA  B 
# 3  NA  NA  A 
# 4 C; F G; H; I  B 
# 5  D H; I NA 
# 6  E  I  B 

Но мне нужно unnest несколько столбцов в моем наборе данных, а столбцы имеют разное число ВПЛ. Я попробовал это, и бросил ошибку:

data %>% 
    transform(resp1 = strsplit(resp1, "; "), 
      resp2 = strsplit(resp2, "; "), 
      resp3 = strsplit(resp3, "; ")) %>% 
    unnest() 
# Error: All nested columns must have the same number of elements. 

Я ожидал, что приведенный выше код даст мне тот же результат, как следующее:

# unnesting multiple response (desired output/is there a better way?) 
data %>% 
    transform(resp1 = strsplit(resp1, "; ")) %>% 
    unnest() %>% 
    transform(resp2 = strsplit(resp2, "; ")) %>% 
    unnest() %>% 
    transform(resp3 = strsplit(resp3, "; ")) %>% 
    unnest() 

#  resp1 resp2 resp3 
#  (chr) (chr) (chr) 
# 1  A  C NA 
# 2  A  D NA 
# 3  A  F NA 
# 4  B NA NA 
# 5  A NA NA 
# 6  B  C  G 
# 7  B  C  H 
# 8  B  C  I 
# 9  B  F  G 
# 10  B  F  H 
# 11  B  F  I 
# 12 NA  D  H 
# 13 NA  D  I 
# 14  B  E  I 

Я новичок в R, но это чувствует себя неуклюжей и заставляет меня задаться вопросом, злоупотребляю ли я тем, что я не должен злоупотреблять. Что происходит с неудачной попыткой множественного опроса?

ответ

1

Отметьте this link, в котором показана другая ситуация с остановкой нескольких столбцов от вашего. Согласно документации и приведенной ссылке, если только не существует какого-либо умного способа сделать это, функция может быть определена только для одного столбца, чтобы избежать двусмысленности.

Таким образом, вам может понадобиться отключить столбцы один за другим, а приведенный ниже код может быть еще громоздким, но упрощает его.

> resp1 <- c("A", "B; A", "B", NA, "B") 
> resp2 <- c("C; D; F", NA, "C; F", "D", "E") 
> resp3 <- c(NA, NA, "G; H; I", "H; I", "I") 
> data <- data.frame(resp1, resp2, resp3, stringsAsFactors = F) 
> data 
    resp1 resp2 resp3 
1  A C; D; F <NA> 
2 B; A <NA> <NA> 
3  B C; F G; H; I 
4 <NA>  D H; I 
5  B  E  I 
library(tidyr) 
library(dplyr) 
data %>% 
transform(resp1 = strsplit(resp1, "; "), 
      resp2 = strsplit(resp2, "; "), 
      resp3 = strsplit(resp3, "; ")) %>% 
unnest(resp1) %>% unnest(resp2) %>% unnest(resp3) 
    resp1 resp2 resp3 
1  A  C <NA> 
2  A  D <NA> 
3  A  F <NA> 
4  B <NA> <NA> 
5  A <NA> <NA> 
6  B  C  G 
7  B  C  H 
8  B  C  I 
9  B  F  G 
10  B  F  H 
11  B  F  I 
12 <NA>  D  H 
13 <NA>  D  I 
14  B  E  I 
+0

Последняя строка дает _error: неправильный размер результата (5), как ожидается 6 или 1_. То же самое, когда я заменяю его 'unnest (resp1, resp2, resp3)'. – alexpghayes

+0

Хм, интересно. Код, похоже, работает для меня. Я вставил весь блок кода, который воспроизводит ваш результат. – Psidom

+0

У меня есть аналогичная проблема, при которой выполнение unsest последовательно не работает, потому что кажется, что удаляет другие вложенные столбцы при первом вызове –

0

В дополнение к Psidom ответ: по умолчанию, unnest падает дополнительные столбцы списка (если требуется дублирование строк).

Используйте аргумент .drop = FALSE, чтобы сохранить другие столбцы.

линия unnest(resp1) %>% unnest(resp2) %>% unnest(resp3) становится:

unnest(resp1, .drop = FALSE) %>% unnest(resp2, .drop = FALSE) %>% unnest(resp3)