Один из вариантов будет 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"))