Общий метод удаления списка строк в R - PullRequest
1 голос
/ 31 марта 2020

Ранее я публиковал вопрос о распаковке списков и объединении .

Хотя ответы там правильно относились к моему первоначальному вопросу, с тех пор я обнаружил, что этот метод не работает на мой существенно более сложный реальный набор данных. Я чувствую, что совершенно новый вопрос необходим для адекватного поиска и обсуждения решения.

Мне нужен общий метод, который объединит списки и data.frames в один tibble. Ниже приведено более сложное MRE в надежде, что кто-то найдет более общее решение.

tibble(person = c("Alice", "Bob", "Mary"), 
          colour = list(c("Red", "Green", "Blue"), c("Orange", "Green", "Yellow"), "Blue"),
          drink = list(c("Pepsi", "Coke", "Fanta"), c("Pepsi"), c("Coke", "Fanta")),
          scores = list(c("1", "17", "32"), c("1", "12"), c("5", "16")),
          geometry = data.frame(type = "Point",
                                coordinates = c("1, 2", "2, 3", "1, 5")))

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

tibble(person = c("Alice", "Bob", "Mary"),
       colour = c("Red, Green, Blue", "Orange, Green, Yellow", "Blue" ),
       drink = c("Pepsi, Coke, Fanta", "Pepsi", "Coke, Fanta"),
       scores = c("1, 17, 32", "1, 12", "5, 16"),
       geometry = c("Point 1, 2", "Point 2, 3", "Point 1, 5"))

1 Ответ

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

Вы можете использовать mutate_if(), чтобы проверить, является ли столбец списком, а затем применить другую функцию в зависимости от того, являются ли эти списки data.frames или нет:

library(dplyr)
library(purrr)

df %>%
  mutate_if(is.list, ~ if(is.data.frame(.x)) do.call(paste, .x) else map_chr(.x, toString))

# A tibble: 3 x 5
  person colour                drink              scores    geometry  
  <chr>  <chr>                 <chr>              <chr>     <chr>     
1 Alice  Red, Green, Blue      Pepsi, Coke, Fanta 1, 17, 32 Point 1, 2
2 Bob    Orange, Green, Yellow Pepsi              1, 12     Point 2, 3
3 Mary   Blue                  Coke, Fanta        5, 16     Point 1, 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...