2017-04-02 1 views
1

Nouveau à R alors posez des questions basiques et stupides. J'espère que je pourrais apprendre de tous les maîtres expérimentés ici et est devenu quelqu'un qui pourrait être utile à tous les autres experts en données aussi bien dans un proche avenir.La bonne façon d'utiliser% in% dans la fonction d'application

Mon objectif est de vérifier chaque ligne de test si id est répertorié dans id_lag dans la même ligne. Mon exemple de code est comme suit:

test <- as.data.frame(matrix(NA,10,3)) 
names(test) <- c("Year","id","id_lag") 
test[,1] <- c(2011,2012,2013,2010,2014,2015,2016,2010,2011,2012) 
test[,2] <- c(76,560,342,7908,200,23,23,890,780,150) 
test[,3] <- c("76,89","209,2000,400","342,333,234","908,888","","23","8097,5678","12","780,209","150,4504") 

involved <- function(id,id_lag) 
{ 
a <- return(id %in% scan(what = "", sep = ",",text = id_lag)) 
return(a) 
} 



check <- apply(test, 1, function(x,y) involved(test$id,test$id_lag)) 

J'attends 1 de 10 liste comme TRUE ou FALSE si elle listé dans cette ligne ou non. Cependant, je reçois une matrice 10 par 10 avec TRUE ou FALSE qui a balayé toute la liste 10 fois. Y a-t-il un moyen que je peux éliminer cette fonction d'application seulement balayer à travers la ligne plutôt que faire l'analyse complète de la liste entière? Ou y a-t-il une meilleure approche, disons data.tables etc, qui fonctionnerait?

Merci,
Anne

Répondre

1

apply(X, MARGIN, FUN, ...) applique une fonction à travers les lignes d'une matrice si MARGIN = 1 et à travers les colonnes si MARGIN = 2.

Qu'est-ce que vous avez fait avec

check <- apply(test, 1, function(x,y) involved(test$id,test$id_lag)) 

est « appeler la fonction involved(test$id,test$id_lag) pour chaque ligne de la matrice text ». Donc, vous vous retrouvez avec une matrice 10x10 parce que vous avez appelé involved(test$id,test$id_lag) une fois pour chacune des 10 lignes de test.

Si vous souhaitez appliquer une fonction sur une ligne tout en prenant les éléments de plusieurs colonnes comme arguments pour chaque appel de fonction, mapply() est une fonction utile. Peut-être quelque chose comme:

mapply(function(x,y) involved(x,y), x = test$id, y = test$id_lag) 
+0

Serait explorer plus sur la famille de fonction d'application. Merci! – Anne