Tidyr: Das Entschachteln von Listenspalten ergab einen Fehler, obwohl alle gleich lang waren

Erstellt am 5. Juni 2018  ·  3Kommentare  ·  Quelle: tidyverse/tidyr

Hier ist ein Beispiel, das den Fehler reproduziert.

> df <- tibble(x = c("a", "b", "c"), y = list(a = 1:3, b = 4:6, c = 7:9), z = list(1:3))
> df
# A tibble: 3 x 3
  x     y         z        
  <chr> <list>    <list>   
1 a     <int [3]> <int [3]>
2 b     <int [3]> <int [3]>
3 c     <int [3]> <int [3]>
> unnest(df)
Error: All nested columns must have the same number of elements.

Ich stelle jedoch fest, dass das Schneiden des gesamten Datenrahmens und das Aufheben der Verschachtelung funktioniert

> df %>% slice(1:n()) %>% unnest()
# A tibble: 9 x 3
  x         y     z
  <chr> <int> <int>
1 a         1     1
2 a         2     2
3 a         3     3
4 b         4     1
5 b         5     2
6 b         6     3
7 c         7     1
8 c         8     2
9 c         9     3
bug rectangling tidy-dev-day

Hilfreichster Kommentar

Hallo @yuanwxu , nur ein weiteres Community-Mitglied hier.
Hier ist ein etwas minimalerer Reprex dessen, was meiner Meinung nach das Problem ist:

Problem

library(tidyverse)
df1 <- tibble(x = c("a"), y = list(1:3), z = list(4:6))
df1 %>% unnest()
#> # A tibble: 3 x 3
#>   x         y     z
#>   <chr> <int> <int>
#> 1 a         1     4
#> 2 a         2     5
#> 3 a         3     6

# add name to list in y causes issue
df2 <- tibble(x = c("a"), y = list(foo = 1:3), z = list(4:6))
df2 %>% unnest()
#> Error: All nested columns must have the same number of elements.

Problemumgehung

Eine andere mögliche Problemumgehung anstelle des Slicens könnte darin bestehen, zuerst die Listenspalten aufzuheben

df2 %>% mutate_if(is.list, unname) %>% unnest()
#> # A tibble: 3 x 3
#>   x         y     z
#>   <chr> <int> <int>
#> 1 a         1     4
#> 2 a         2     5
#> 3 a         3     6

Warum passiert das?
Wenn ich mir den Code anschaue, denke ich, dass dieses Verhalten von

https://github.com/tidyverse/tidyr/blob/cbdd14e90b2a771e242a44d1ed5eea84d53da642/R/unnest.R#L96 -L100

Wenn wir das für unser Beispiel anpassen, können wir sehen, warum die Fehlermeldung auftritt:

# lengths considered the same
n1 <- df1 %>% select(-x) %>% map(~ map_int(., NROW))
n1
#> $y
#> [1] 3
#> 
#> $z
#> [1] 3
length(unique(n1))
#> [1] 1

# lengths considered different
n2 <- df2 %>% select(-x) %>% map(~ map_int(., NROW))
n2
#> $y
#> foo 
#>   3 
#> 
#> $z
#> [1] 3
length(unique(n2))
#> [1] 2

Alle 3 Kommentare

Hallo @yuanwxu , nur ein weiteres Community-Mitglied hier.
Hier ist ein etwas minimalerer Reprex dessen, was meiner Meinung nach das Problem ist:

Problem

library(tidyverse)
df1 <- tibble(x = c("a"), y = list(1:3), z = list(4:6))
df1 %>% unnest()
#> # A tibble: 3 x 3
#>   x         y     z
#>   <chr> <int> <int>
#> 1 a         1     4
#> 2 a         2     5
#> 3 a         3     6

# add name to list in y causes issue
df2 <- tibble(x = c("a"), y = list(foo = 1:3), z = list(4:6))
df2 %>% unnest()
#> Error: All nested columns must have the same number of elements.

Problemumgehung

Eine andere mögliche Problemumgehung anstelle des Slicens könnte darin bestehen, zuerst die Listenspalten aufzuheben

df2 %>% mutate_if(is.list, unname) %>% unnest()
#> # A tibble: 3 x 3
#>   x         y     z
#>   <chr> <int> <int>
#> 1 a         1     4
#> 2 a         2     5
#> 3 a         3     6

Warum passiert das?
Wenn ich mir den Code anschaue, denke ich, dass dieses Verhalten von

https://github.com/tidyverse/tidyr/blob/cbdd14e90b2a771e242a44d1ed5eea84d53da642/R/unnest.R#L96 -L100

Wenn wir das für unser Beispiel anpassen, können wir sehen, warum die Fehlermeldung auftritt:

# lengths considered the same
n1 <- df1 %>% select(-x) %>% map(~ map_int(., NROW))
n1
#> $y
#> [1] 3
#> 
#> $z
#> [1] 3
length(unique(n1))
#> [1] 1

# lengths considered different
n2 <- df2 %>% select(-x) %>% map(~ map_int(., NROW))
n2
#> $y
#> foo 
#>   3 
#> 
#> $z
#> [1] 3
length(unique(n2))
#> [1] 2

Sieht so aus, als müssten wir die Namen hier entfernen.

Ich werde daran für den Dev Day arbeiten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen