Управлять каждой строкой кадра данных, содержащего списки в R - PullRequest
1 голос
/ 12 марта 2020

У меня есть кадр данных, который выглядит следующим образом:

df <- data.frame(id=c("list1", "list2"))
df$Content <- list(c("A", "B", "C"), c("A", "B", "A"))

Для каждой строки в «Содержании» я хотел бы сначала удалить дубликаты, а затем найти все строки, содержащие определенные элементы, например «A» и он будет возвращать как строки 1, так и 2.

Я пытался использовать duplicate () с apply () , но, похоже, он находит дубликаты на Уровень списка, например, c ("A", "B", "C") соответствует c ("A", "B", "A") вместо поиска дубликатов в каждом списке.

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

Единственное, что я Можно подумать, использует для l oop, но мне было интересно, есть ли более элегантный способ сделать это.

1 Ответ

1 голос
/ 12 марта 2020

Мы можем использовать map до l oop над элементами list, возвращать элементы unique, затем filter строки набора данных, где есть «A» в «Содержании»

library(dplyr)
library(purrr)
df %>%
   mutate(Content  = map(Content, unique)) %>%
   filter(map_lgl(Content, ~ 'A' %in% .x))
#    id Content
#1 list1 A, B, C
#2 list2    A, B

Или другой вариант - unnest столбец list, сделать group_by filter в строках distinct и затем condense (из devel версии dplyr) или summarise в столбец list

df %>%
    unnest(c(Content)) %>% 
    distinct() %>% 
    group_by(id) %>% 
    filter('A' %in% Content) %>%
    condense(Content)
# A tibble: 2 x 2
# Rowwise:  id
#  id    Content  
#   <fct> <list>   
#1 list1 <chr [3]>

2 list2

...