Как я могу создать список, объединяющий элементы из таблицы? - PullRequest
1 голос
/ 27 сентября 2019

У меня есть следующий тиббл:

  ID    group   val_1   val_2
  <chr> <chr>   <dbl>  <dbl>
1 A     RED          1     3
2 A     BLUE         2     4
3 A     BLACK        1     5
4 B     RED          2     5
5 B     BLUE         1     6
6 B     BLACK        2     6

И я хочу пройти через этот тиббл, чтобы создать список списков.Каждый вложенный список должен быть списком для каждого идентификатора со следующими элементами.Например, для ID == A:

A
$BLACK
[1] 1 5

$RED
[1] 1 3

$BLUE
[1] 2 4

Вторым элементом списка должен быть список для ID == B.Я уже пробовал purrr::transpose(), но он не выполняет то, что я хочу, так как создает список из 6 элементов (по одному на строку).Я пытался group_by(ID), но он не генерировал ожидаемый результат.Буду признателен за любые предложения.

1 Ответ

0 голосов
/ 27 сентября 2019

Один из вариантов будет split

lapply(split(df1, df1$ID), function(x) lapply(split(x[3:4],
         x$group), unlist, use.names = FALSE))
#$A
#$A$BLACK
#[1] 1 5

#$A$BLUE
#[1] 2 4

#$A$RED
#[1] 1 3


#$B
#$B$BLACK
#[1] 2 6

#$B$BLUE
#[1] 1 6

#$B$RED
#[1] 2 5

С tidyverse мы также можем nest

library(dplyr)
df1 %>% 
   group_by(ID, group) %>% 
   nest

Или другой вариант -преобразовать в 'длинный' формат с помощью pivot_longer, а затем выполнить split

library(tidyr)
library(purrr)
df1 %>% 
  pivot_longer(cols = -c(ID, group)) %>%
  split(.$ID) %>% 
  map(~  {split(.x$value, .x$group)})

data

df1 <- structure(list(ID = c("A", "A", "A", "B", "B", "B"), group = c("RED", 
"BLUE", "BLACK", "RED", "BLUE", "BLACK"), val_1 = c(1L, 2L, 1L, 
2L, 1L, 2L), val_2. = c(3L, 4L, 5L, 5L, 6L, 6L)), 
 class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...