Ken
Ken

Reputation: 207

How to select one value of a data.frame within a list column with R?

I have a data.frame that contains a type column. The list contains a 1x3 data.frame. I only want one value from this list. Thus will flatten my data.frame so I can write out a csv.

How do I select one item from the nested data.frame (see the 2nd column)? screenshot

Here's the nested col. I'd provide the data but cannot flatten to write_csv.

enter image description here

result of dput:

structure(list(id = c("1386707", "1386700", "1386462", "1386340", 
"1386246", "1386300"), fields.created = c("2020-05-07T02:09:27.000-0700", 
"2020-05-07T01:20:11.000-0700", "2020-05-06T21:38:14.000-0700", 
"2020-05-06T07:19:44.000-0700", "2020-05-06T06:11:43.000-0700", 
"2020-05-06T02:26:44.000-0700"), fields.customfield_10303 = c(NA, 
NA, 3, 3, NA, NA), fields.customfield_28100 = list(NULL, structure(list(
    self = ".../rest/api/2/customFieldOption/76412", 
    value = "New Feature", id = "76412"), .Names = c("self", 
"value", "id"), class = "data.frame", row.names = 1L), structure(list(
    self = ".../rest/api/2/customFieldOption/76414", 
    value = "Technical Debt", id = "76414"), .Names = c("self", 
"value", "id"), class = "data.frame", row.names = 1L), NULL, 
    structure(list(self = ".../rest/api/2/customFieldOption/76411", 
        value = "Maintenance", id = "76411"), .Names = c("self", 
    "value", "id"), class = "data.frame", row.names = 1L), structure(list(
        self = ".../rest/api/2/customFieldOption/76412", 
        value = "New Feature", id = "76412"), .Names = c("self", 
    "value", "id"), class = "data.frame", row.names = 1L))), row.names = c(NA, 
6L), class = "data.frame", .Names = c("id", "fields.created", 
"fields.customfield_10303", "fields.customfield_28100"))

Upvotes: 1

Views: 1892

Answers (2)

Arnaud Feldmann
Arnaud Feldmann

Reputation: 755

library(dplyr)
library(tidyr)

df <- tibble(Group=c("A","A","B","C","D","D"),
       Batman=1:6,
       Superman=c("red","blue","orange","red","blue","red"))

nested <- df %>%
  nest(data=-Group)

unnested <- nested %>%
  unnest(data)

Nesting and unnesting data with tidyr

library(purrr)
nested %>%
  mutate(data=map(data,~select(.x,2))) %>%
  unnest(data)

select with purrr, but lapply as you've done is fine, it's just for aesthetics ;)

Upvotes: 0

Ken
Ken

Reputation: 207

I found a way to do this.

First, instead of changing the data, I added a column with mutate. Then, directly selected the same column from all nested lists. Then, I converted the list column into a vector. Finally, I cleaned it up by removing the other columns.

It seems to work. I don't know yet how it will handle multiple rows within the nested df.

   dat <- sample_dat %>% 
   mutate(cats = sapply(nested_col, `[[`, 2)) %>% 
   mutate(categories = sapply(cats, toString)) %>% 
   select(-nested_col, -cats)

Related

Upvotes: 1

Related Questions