2017-09-28 11 views
-1

Je cherche un moyen efficace de trouver les mêmes éléments avec le même index dans deux vecteurs et de les compter. Dire que j'ai deux vecteurs et je veux savoir combien de fois j'ai eu la réalisation [1,1] Donc, si j'ai deux vecteurs (en pratique, ils seront très grande), par exempleTrouver les mêmes éléments avec le même index pour deux vecteurs

x=c(2,1,8,1,4) 
y=c(9,1,8,0,4) 

I vouloir compter que 1 est apparu seulement une fois dans la même position de x et y. Je serais très reconnaissant pour votre aide!

+3

J'ai l'impression qu'il me manque quelque chose, mais n'est-ce pas simplement 'sum (x == y & x == 1)'? – Henrik

+1

J'ai vérifié et il n'a pas compté toutes les mêmes entrées qui donnent (1,1) en comparant les vecteurs. L'approche de réduction d'akrun fonctionne parfaitement – Arbiturka

+2

@Arbiturka C'est intéressant ... ils semblent logiquement équivalents, mais peut-être que le calcul en virgule flottante interfère. Pouvez-vous donner un exemple? – Frank

Répondre

0

Nous pouvons créer un matrix par cbind ing les vecteurs, vérifier si elle est égale à 1, obtenir le rowSums, si les deux vecteurs ont 1 à la même position, il sera 2 et s'il n'y a qu'un 1, la valeur sera 1. Ainsi, le convertir en un vector logique (ou ==2==1) et obtenir le nombre avec sum

sum(rowSums(cbind(x, y)==1)==2) 
sum(rowSums(cbind(x, y)==1)==1) 

Notez que ce vérifie également si le 1 est soit « x » ou « y » et pas seulement en 'x'


Ou avec Reduce

sum(Reduce(`&`, lapply(list(x, y), `==`, 1))) 

Notez que ces solutions peuvent être étendues à plusieurs vector s au lieu de deux

0

Pour tous ceux qui recherchent ce correctif tidyverse rapide que vous avez si désespérément besoin:

library(purrr) 

map(list(x, y), ~.== 1) %>% reduce(., `&`) %>% sum 

Pour les indices:

map(list(x, y), ~.== 1) %>% reduce(., `&`) %>% which