11
votes

Comment extraire des valeurs de la liste uniforme dans R?

Par exemple, comment puis-je obtenir un vecteur de chaque personne de chaque personne dans la liste personnes ci-dessous: xxx

y a-t-il un équivalent d'une liste de python compréhension ou quelque chose au même effet?


0 commentaires

5 Réponses :


21
votes

Vous pouvez utiliser Sapply :

> sapply(people, function(x){as.numeric(x[2])})
[1] 23 35 20 31 26


1 commentaires

FacePalms J'ai totalement ignoré les choses * Appliquer ... Très serviable. Merci.



7
votes

Compte tenu de la structure de données que vous avez fournie, j'utiliserais sapply code>: xxx pré>

Cependant, vous remarquerez que les résultats de ceci sont des données de caractères. p> xxx pré>

une approche serait de coercer à as.numeric () code> ou as.Integer () code> dans l'appel Sapply. p>

Alternativement - si vous avez une flexibilité sur la manière dont vous stockez les données en premier lieu, il peut être logique de le stocker comme une liste de data.frame code> s: P>

people2 <- data.frame(name = c("Paul", "Peter", "Sam", "Lyle", "Fred")
                      , age = c(23,35,20,31, 26))


7 commentaires

Oui dans cet exemple simple, une image de données est probablement meilleure. Mais l'exemple "réel" est beaucoup plus compliqué afin qu'une liste soit meilleure. Merci quand même


@ c00kie - c'est ce que j'ai pensé, mais parfois il est facile de négliger l'apparemment évident :)


+1 Pour les conseils sur R-ISH, plutôt que des structures de données pythoniques. En outre, juste parce que je pense que c'est tifty: sapply (personnes, "[", 2) .


@Joran, qu'est-ce que le "[" a fait dans l'appel saphi? J'ai déjà vu cette notation avant, mais je ne me souviens pas vraiment d'où ...


@ C00kie - [ est utilisé comme outil d'indexation. La page d'aide est assez utile et a de bonnes informations dedans ? '[' . [[ et $ y sont également discutés.


Donc [ est une fonction; Tapez ? "[" pour plus. Vous pouvez donc appliquer la «fonction d'élément extrait» à chaque élément de personnes . 2 est transmis comme un argument supplémentaire à [ via ... dans sapply .


+1 à la méthode de @ Joran. Une autre option est sapply (personnes, '[', 'Âge') .



1
votes
ages <- sapply(1:length(people), function(i) as.numeric(people[[i]][[2]]))
ages
Output:
  [1] 23 35 20 31 26

0 commentaires

0
votes

Alternativement au Appliquer code> -Family Il y a @ haref="http://purrr.tidyveryver.org/" rel="nofollow noreferrer"> Purrr code> Package qui offre la carte _ code> -fonctions pour ce type de travail.

(il y a quelques différences pour le appliquer code> -Family discuté par exemple ici .) P>

Exemple ops: p> xxx pré>

SAPPLY code> Approche: P> xxx pré>

et la carte approche: p> xxx pré>

bien sûr, ils sont identiques: p>

identical(ages_sapply, ages_map)
[1] TRUE


0 commentaires

0
votes

Bien que cette question soit assez ancienne, j'aimerais partager mon approche à ce sujet. Il est certainement possible de faire avec le sapply comme Tflutre suggérées. Mais je trouve plus intuitif en utilisant la fonction non tuniste : xxx

Notez la multiplication par deux dans 2 * Longueur (personnes) , il existe deux éléments stockés dans la liste pople . Cela peut être rendu plus générique en écrivant longueur (personnes [[1]]) * longueur (personnes)

ici irréaliste (personnes, utilisation.names = f) rendements xxx

et nous tranche que par tous les autres éléments utilisant SEQ commande.


0 commentaires