J'ai une liste imbriquée avec des noms: Je voudrais le convertir en cadre de données. Je pourrais le faire avec tandis que je voudrais créer des noms informatifs Rejoindre les noms de deux niveaux de liste ensemble. Donc, la sortie résultante serait la suivante: p> Comment puis-je atteindre cela de la manière la plus efficace? P> p> dplyr :: bind_cols code>, mais mes noms sont partiellement perdus: p>
4 Réponses :
Je n'ai pas utilisé dplyr strong>, mais data.table strong> et rlist strong>. Est-ce ce que vous vouliez? P> library(data.table)
library(rlist)
lst <- list(var1 = list(`0.1` = c(100, 10, 1, 0.1, 0.01),
`0.2` = c(100, 20, 4, 0.8, 0.16),
`0.3` = c(100, 30, 9, 2.7, 0.81),
`0.4` = c(100, 40, 16, 6.4, 2.56),
`0.5` = c(100, 50, 25, 12.5, 6.25),
`0.6` = c(100, 60, 36, 21.6, 12.96),
`0.7` = c(100, 70, 49, 34.3, 24.01),
`0.8` = c(100, 80, 64, 51.2, 40.96),
`0.9` = c(100, 90, 81, 72.9, 65.61)),
var2 = list(`0.1` = c(10, 11, 11.1, 11.11, 11.111),
`0.2` = c(10, 12, 12.4, 12.48, 12.496),
`0.3` = c(10, 13, 13.9, 14.17, 14.251),
`0.4` = c(10, 14, 15.6, 16.24, 16.496),
`0.5` = c(10, 15, 17.5, 18.75, 19.375),
`0.6` = c(10, 16, 19.6, 21.76, 23.056),
`0.7` = c(10, 17, 21.9, 25.33, 27.731),
`0.8` = c(10, 18, 24.4, 29.52, 33.616),
`0.9` = c(10, 19, 27.1, 34.39, 40.951)))
temp = lapply(lst, as.data.table)
final = rlist::list.cbind( temp )
final
#> var1.0.1 var1.0.2 var1.0.3 var1.0.4 var1.0.5 var1.0.6 var1.0.7 var1.0.8
#> 1: 1e+02 100.00 100.00 100.00 100.00 100.00 100.00 100.00
#> 2: 1e+01 20.00 30.00 40.00 50.00 60.00 70.00 80.00
#> 3: 1e+00 4.00 9.00 16.00 25.00 36.00 49.00 64.00
#> 4: 1e-01 0.80 2.70 6.40 12.50 21.60 34.30 51.20
#> 5: 1e-02 0.16 0.81 2.56 6.25 12.96 24.01 40.96
#> var1.0.9 var2.0.1 var2.0.2 var2.0.3 var2.0.4 var2.0.5 var2.0.6 var2.0.7
#> 1: 100.00 10.000 10.000 10.000 10.000 10.000 10.000 10.000
#> 2: 90.00 11.000 12.000 13.000 14.000 15.000 16.000 17.000
#> 3: 81.00 11.100 12.400 13.900 15.600 17.500 19.600 21.900
#> 4: 72.90 11.110 12.480 14.170 16.240 18.750 21.760 25.330
#> 5: 65.61 11.111 12.496 14.251 16.496 19.375 23.056 27.731
#> var2.0.8 var2.0.9
#> 1: 10.000 10.000
#> 2: 18.000 19.000
#> 3: 24.400 27.100
#> 4: 29.520 34.390
#> 5: 33.616 40.951
Pas exactement, comme j'aimerais vraiment séparer avec _ code> et non
. Code> et la nécessité d'importer deux paquets pour cette opération semble plutôt décourageant. Mais appréciez la tentative (+1)
data.table code> est une alternative valide à
dplyr code> et
rlist code> est une implémentation très puissante d'outils pour travailler avec des objets de liste. Si vous souhaitez avoir un
_ code> entre, vous pouvez simplement le remplacer par
data.Table :: setnames () code> qui fait tout par référence et c'est super rapide. Personnellement, je ne vois aucun problème dans l'importation de plusieurs packages, ils obtiennent le travail rapidement.
Vous pouvez utiliser Si vous connaissez vos noms de niveau interne avant la main, il est encore plus simple: p> dplyr :: bind_cols code> pour convertir un cadre de données (comme vous l'avez mentionné), puis modifier les noms à l'aide de la base R en répliquant les noms de premier niveau Nombre de fois:
en base-r Une autre méthode de base-r (celui-ci est beaucoup plus facile à comprendre) p> sortie < / p>
a créé sur 2020-04-30 par le package Reprex (v0.3.0) sup> p> p> data.table code> solution