J'ai besoin de créer une liste à partir des lignes d'un dataframe au format suivant:
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"
Ceci est un exemple quand il y a deux lignes dans le dataframe. Comment puis-je y parvenir lorsque le nombre de lignes dans le dataframe est variable? Donc, pour chaque ligne du dataframe, il devrait y avoir une liste.
3 Réponses :
Nous commençons par fractionner chaque ligne de la trame de données, puis pour chaque ligne, nous convertissons chaque élément en élément de liste distinct en utilisant 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"
Nous pouvons également utiliser apply en parcourant les lignes et en appliquant as.list à chacun:
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"
Nous pouvons utiliser transpose depuis 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"