2012-06-15 3 views
3

J'ai une longue liste contenant différents nombres d'éléments qui peuvent également se reproduire dans le même champ.
Voici un exemple des cinq premières lignes:Calcul du nombre et de la fréquence des éléments de liste dans R?

A <- list(c("JAMES","CHARLES","JAMES","RICHARD"), 
      c("JOHN","ROBERT","CHARLES"), 
      c("CHARLES","WILLIAM","CHARLES","MICHAEL","WILLIAM","DAVID","CHARLES","WILLIAM"), 
      c("CHARLES"), 
      c("CHARLES","CHARLES")) 

J'aimerais maintenant calculer le nombre d'éléments pour chaque ligne de la liste.
Ma sortie désirée ressemblerait à ceci:

[1] 4 
[2] 3 
[3] 7 
[4] 1 
[5] 2 

En plus de cela, je voudrais connaître la fréquence du terme « CHARLES » se produit dans chaque ligne.
Sur la base de mon exemple, je voudrais obtenir une sortie semblable à ceci:

[1] 1 
[2] 1 
[3] 3 
[4] 1 
[5] 2 

Je pensais que cela:

> table(A) 
Error in table(A) : all arguments arguments must have same length 
> sum(A) 
Error in sum(A) : invalid 'type' (list) of argument 

Mais je ne sais pas quoi faire au sujet de ces messages d'erreur et je ne suis pas au courant des alternatives, malheureusement.
Je sais que le nombre de lignes de la liste est:

> length(A) 
[1] 5 

Mais cela ne répond pas à ma question, malheureusement. Je n'ai pas trouvé d'autres réponses non plus.
Par conséquent, je voudrais vous demander de m'aider s'il vous plaît à calculer ces deux mesures!

Merci beaucoup d'avance!

Répondre

6

Vous devriez vous familiariser avec lapply et sapply à boucle sur les listes:

sapply(A, length) 
[1] 4 3 8 1 2 

sapply(A, function(x)sum(grepl("CHARLES", x))) 
[1] 1 1 3 1 2 

Qu'est-ce que grepl() fait est de faire correspondre une expression régulière à votre texte, et renvoie VRAI ou FAUX selon s'il y a un match. Je fais ensuite un sum() sur ces valeurs logiques, c'est-à-dire en additionnant les valeurs TRUE.

+1

Merci beaucoup pour cette réponse concise et utile! – user0815

6
sapply(A, function(x) length(x)) 
[1] 4 3 8 1 2 
un <- unique(unlist(A)) 
nm <- lapply(un, function(x) sapply(A, function(y) sum(y == x))) 
names(nm) <- un 
nm 
$JAMES 
[1] 2 0 0 0 0 

$CHARLES 
[1] 1 1 3 1 2 

$RICHARD 
[1] 1 0 0 0 0 

$JOHN 
[1] 0 1 0 0 0 

$ROBERT 
[1] 0 1 0 0 0 

$WILLIAM 
[1] 0 0 3 0 0 

$MICHAEL 
[1] 0 0 1 0 0 

$DAVID 
[1] 0 0 1 0 0 
+0

Merci beaucoup, c'est aussi très utile! – user0815

3

Pour le calcul de la longueur des éléments de la liste A.You peut utiliser la commande suivante:

list.len <- lapply(1:length(A),function(x) length(A[[x]])) 
unlist(list.len) 
[1] 4 
[2] 3 
[3] 7 
[4] 1 
[5] 2 

pour calculer le nombre de fois « CHARLES » apparaissent dans chaque élément de la liste que vous pouvez faire ce qui suit :

len.name <- lapply(1:length(A),function(x) length(which(A[[x]] == "CHARLES"))) 
len.name 
[[1]] 
[1] 1 

[[2]] 
[1] 1 

[[3]] 
[1] 3 

[[4]] 
[1] 1 

[[5]] 
[1] 2 

alors vous pouvez unlist

unlist(len.name) 

et vous wi Sera la sortie à être:

[1] 1 
[2] 1 
[3] 3 
[4] 1 
[5] 2 
+1

Nice. Plutôt que d'utiliser 'unlist', je vous suggère d'utiliser' sapply', qui retourne une version simplifiée de 'lapply'. – Andrie

+0

Merci beaucoup pour votre solution utile! – user0815

Questions connexes