jhp
August 19, 2020, 2:32am
1
I'm having trouble unnesting a tibble column I was hoping to get some help with. I've done my best to make a reprex but it is still quite packed because of the tibble column, please excuse me.
How can I change the nested pap_name column to specifically to allow for unnesting?
Edit: Simplified example after based on @technocrat 's advice
library(tidyverse)
df <-
structure(list(user_id = c("6bemf", "vb76d"), registration_results = list(
structure(list(
pap_name = list(NULL),
pap_file_url = list(NULL)
), row.names = c(
NA,
-1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
pap_name = "", pap_file_url = ""
), row.names = c(NA, -1L), class = c(
"tbl_df",
"tbl", "data.frame"
))
)), row.names = c(NA, -2L), class = c(
"tbl_df",
"tbl", "data.frame"
))
df %>%
unnest(registration_results)
#> Error: Can't combine `..1$pap_name` <list> and `..2$pap_name` <character>.
Created on 2020-08-18 by the reprex package (v0.3.0)
is what the error message is complaining about. Behind that, there seems to be a complaint about applying nest to a function. I suggest simplifying to a test case to help isolate.
1 Like
jhp
August 19, 2020, 3:06am
3
I am wondering if I can use purrr to target pap_file_url and change it from list(NULL) to something like list("")?
Maybe. But first start with the tiniest step that will get you an object to explore further.
jhp
August 19, 2020, 2:58pm
5
I guess you can think of the problem as
tibble(data = c(tibble(x = list(NULL)),
tibble(x = ""))) %>%
unnest(data)
#> Error: Can't combine `..1$data` <list> and `..2$data` <character>.
although I'm not sure if there I am loosing too much information here. My guess is maintaining the list structure is going to be important to scale up
tibble(data = c(tibble(x = list(NULL)),
tibble(x = list("")))) %>%
unnest(data)
This code doesnt error
1 Like
jhp
August 19, 2020, 4:17pm
8
So my open questions are:
how do I put the second row into a list and not the first?
How do I apply that only to the the nested x column and not the other columns (a la for the original data)?
Something like that is ugly but should work:
map_df(df$registration_results, ~ map_chr(.x, ~ if(is.list(.x)){""}else{.x}))
There are 2 nested maps:
loop on the rows of the nested column
loop on the columns of the tibble in each row of the nested column
And for each column look whether it's a character vector or a list(NULL). It may be slightly more robust that way:
map_df(df$registration_results, ~ map_chr(.x, ~ if(identical(.x, list(NULL))){""}else{.x}))
jhp:
how do I put the second row into a list and not the first?
How do I apply that only to the the nested x column and not the other columns (a la for the original data)?
First I think could be obtained by modifying what I have above. Second, you can use a mutate with across, I guess, to treat list-columns only.
1 Like
system
Closed
September 10, 2020, 2:21pm
10
This topic was automatically closed 21 days after the last reply. New replies are no longer allowed. If you have a query related to it or one of the replies, start a new topic and refer back with a link.