Создать список, содержащий переменное количество списков - PullRequest
0 голосов
/ 05 января 2019

Мне нужно создать список из строк кадра данных в следующем формате:

df <- data.frame(y1 = c("a", "d"), y2 = c("b", "e"), y3 = c("c", "f"))
df$y1 <- as.character(df$y1)
df$y2 <- as.character(df$y2)
df$y3 <- as.character(df$y3)
x <- list(
  list(y1 = df$y1[1],
       y2 = df$y2[1],
       y3 = df$y3[1]),
  list(y1 = df$y1[2],
       y2 = df$y2[2],
       y3 = df$y3[2])
)

> x
[[1]]
[[1]]$`y1`
[1] "a"

[[1]]$y2
[1] "b"

[[1]]$y3
[1] "c"


[[2]]
[[2]]$`y1`
[1] "d"

[[2]]$y2
[1] "e"

[[2]]$y3
[1] "f"

Это пример, когда в кадре данных есть две строки. Как я могу добиться этого, когда количество строк в кадре данных является переменной? Поэтому для каждой строки в кадре данных должен быть список.

Ответы [ 4 ]

0 голосов
/ 05 января 2019

Мы можем использовать transpose от purrr

library(purrr)
transpose(df)
#[1]]
#[[1]]$y1
#[1] "a"

#[[1]]$y2
#[1] "b"

#[[1]]$y3
#[1] "c"


#[[2]]
#[[2]]$y1
#[1] "d"

#[[2]]$y2
#[1] "e"

#[[2]]$y3
#[1] "f"
0 голосов
/ 05 января 2019

Мы также можем использовать apply, перебирая строки и применяя as.list к каждому:

apply(df, 1, as.list)
[[1]]
[[1]]$y1
[1] "a"

[[1]]$y2
[1] "b"

[[1]]$y3
[1] "c"


[[2]]
[[2]]$y1
[1] "d"

[[2]]$y2
[1] "e"

[[2]]$y3
[1] "f"
0 голосов
/ 05 января 2019

возможно, это может вам помочь:

lst1 <- sapply(df,list)
lst2 <- lapply(lst1, function(x) split(x, lst1$y2))
0 голосов
/ 05 января 2019

Сначала split каждая строка в кадре данных, а затем для каждой строки мы конвертируем каждый элемент в отдельный элемент списка, используя as.list

lapply(split(df, 1:nrow(df)), as.list)


#$`1`
#$`1`$y1
#[1] "a"

#$`1`$y2
#[1] "b"

#$`1`$y3
#[1] "c"


#$`2`
#$`2`$y1
#[1] "d"

#$`2`$y2
#[1] "e"

#$`2`$y3
#[1] "f"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...