Удалить список и объединить в R - PullRequest
2 голосов
/ 31 марта 2020

I sh для удаления (сглаживания?) И объединения строк (через запятую) текста внутри tibble. Пример данных:

library(tidyverse)

tibble(person = c("Alice", "Bob", "Mary"), 
          score = list(c("Red", "Green", "Blue"), c("Orange", "Green", "Yellow"), "Blue"))

# A tibble: 3 x 2
  person score    
  <chr>  <list>   
1 Alice  <chr [3]>
2 Bob    <chr [3]>
3 Mary   <chr [1]>

Ожидаемый результат:

tibble(person = c("Alice", "Bob", "Mary"),
       score = c("Red, Green, Blue", "Orange, Green, Yellow", "Blue" ))

# A tibble: 3 x 2
  person score                
  <chr>  <chr>                
1 Alice  Red, Green, Blue     
2 Bob    Orange, Green, Yellow
3 Mary   Blue   

Я подозреваю, что есть очень аккуратное решение tidyverse, но я не смог найти ответ после тщательного поиска; Я подозреваю, что я использую неправильные условия поиска (unnest / concatentate). Решение tidyverse было бы предпочтительным. Спасибо.

Ответы [ 3 ]

5 голосов
/ 31 марта 2020

Вы можете сделать:

library(dplyr)
library(purrr)

df %>%
  mutate(score = map_chr(score, toString))

# A tibble: 3 x 2
  person score                
  <chr>  <chr>                
1 Alice  Red, Green, Blue     
2 Bob    Orange, Green, Yellow
3 Mary   Blue                

Если у вас есть несколько столбцов списка, вы можете сделать:

df <- tibble(person = c("Alice", "Bob", "Mary"), 
       score1 = list(c("Red", "Green", "Blue"), c("Orange", "Green", "Yellow"), "Blue"),
       score2 = rev(list(c("Red", "Green", "Blue"), c("Orange", "Green", "Yellow"), "Blue")))

df %>%
  mutate_if(is.list, ~ map_chr(.x, toString))

# A tibble: 3 x 3
  person score1                score2               
  <chr>  <chr>                 <chr>                
1 Alice  Red, Green, Blue      Blue                 
2 Bob    Orange, Green, Yellow Orange, Green, Yellow
3 Mary   Blue                  Red, Green, Blue     
2 голосов
/ 31 марта 2020

Простой способ будет unnest данные в длинном формате и свернуть их по группам.

library(dplyr)

df %>%
  tidyr::unnest(score) %>%
  group_by(person) %>%
  summarise(score = toString(score))

# person score                
#  <chr>  <chr>                
#1 Alice  Red, Green, Blue     
#2 Bob    Orange, Green, Yellow
#3 Mary   Blue        

Другой вариант будет rowwise

df %>% rowwise() %>% mutate(score = toString(score))
1 голос
/ 31 марта 2020

Раствор Base R 1:

df$score <- sapply(df$score, toString)

Раствор Base R 2:

df$score <- unlist(lapply(df$score, paste, collapse = ", "))

Данные:

df <- tibble(person = c("Alice", "Bob", "Mary"), 
       score = list(c("Red", "Green", "Blue"), c("Orange", "Green", "Yellow"), "Blue"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...