165 votes

lignes data.frame vers une liste

J'ai un data.frame que je voudrais convertir en liste par lignes, ce qui signifie que chaque ligne correspondrait à ses propres éléments de liste. En d'autres termes, je voudrais une liste qui est aussi longue que le data.frame a des lignes.

Jusqu'à présent, j'ai abordé ce problème de la manière suivante, mais je me demandais s'il y avait une meilleure façon d'aborder cela.

xy.df <- data.frame(x = runif(10),  y = runif(10))

# pre-allocate a list and fill it with a loop
xy.list <- vector("list", nrow(xy.df))
for (i in 1:nrow(xy.df)) {
    xy.list[[i]] <- xy.df[i,]
}

192voto

flodel Points 41487

Comme ceci :

xy.list <- split(xy.df, seq(nrow(xy.df)))

Et si vous voulez que les rownames de xy.df soient les noms de la liste de sortie, vous pouvez faire :

xy.list <- setNames(split(xy.df, seq(nrow(xy.df))), rownames(xy.df))

61voto

Roman Luštrik Points 19295

Eureka !

xy.list <- as.list(as.data.frame(t(xy.df)))

20voto

Mike Stanley Points 1030

Une solution plus moderne n'utilise que purrr::transpose :

library(purrr)
iris[1:2,] %>% purrr::transpose()
#> [[1]]
#> [[1]]$Sepal.Length
#> [1] 5.1
#> 
#> [[1]]$Sepal.Width
#> [1] 3.5
#> 
#> [[1]]$Petal.Length
#> [1] 1.4
#> 
#> [[1]]$Petal.Width
#> [1] 0.2
#> 
#> [[1]]$Species
#> [1] 1
#> 
#> 
#> [[2]]
#> [[2]]$Sepal.Length
#> [1] 4.9
#> 
#> [[2]]$Sepal.Width
#> [1] 3
#> 
#> [[2]]$Petal.Length
#> [1] 1.4
#> 
#> [[2]]$Petal.Width
#> [1] 0.2
#> 
#> [[2]]$Species
#> [1] 1

17voto

Qiou Bi Points 41

Si vous voulez abuser complètement du data.frame (comme je le fais) et que vous souhaitez conserver la fonctionnalité $ , une façon est de diviser votre data.frame en une ligne data.frames rassemblées dans une liste :

> df = data.frame(x=c('a','b','c'), y=3:1)
> df
  x y
1 a 3
2 b 2
3 c 1

# 'convert' into a list of data.frames
ldf = lapply(as.list(1:dim(df)[1]), function(x) df[x[1],])

> ldf
[[1]]
x y
1 a 3    
[[2]]
x y
2 b 2
[[3]]
x y
3 c 1

# and the 'coolest'
> ldf[[2]]$y
[1] 2

Il n'est pas seulement la masturbation intellectuelle, mais permet de « transformer » le data.frame en une liste de ses lignes, en conservant l'indexation $ qui peut être utile pour une utilisation ultérieure avec lapply (en supposant que la fonction que vous passez à lapply utilise cette indexation $ )

15voto

Ronak Shah Points 24715

Quelques autres options :

Avec asplit

asplit(xy.df, 1)
#[[1]]
#     x      y 
#0.1137 0.6936 

#[[2]]
#     x      y 
#0.6223 0.5450 

#[[3]]
#     x      y 
#0.6093 0.2827 
#....

Avec split et row

split(xy.df, row(xy.df)[, 1])

#$`1`
#       x      y
#1 0.1137 0.6936

#$`2`
#       x     y
#2 0.6223 0.545

#$`3`
#       x      y
#3 0.6093 0.2827
#....

données

set.seed(1234)
xy.df <- data.frame(x = runif(10),  y = runif(10))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X