On Mon, 27 Aug 2007, [EMAIL PROTECTED] wrote: > Dear R-users, > > For a data frame (say in this example X) I want to look up the > corresponding value in a 'look-up data frame' (in this example Y). The > for-loop works but is very time-consuming because 'X' in reality is very > big. > Therefore I would like to have a solution with apply. However, I do not > succeed. Any suggestions? > > Thanks in advance, > > Hanneke > > c1=c('a','a','b') > c2=c('j','k','k') > > V1=c('a','a','a','a','b','b','b','b'))
You have a syntax error in the previous line - '))' > V2=c('i','j','k','l','i','j','k','l') > V3=c(4,3,2,1,8,5,2,-1) > > > X=NULL > X$c1=c1 > X$c2=c2 > X=as.data.frame(X) > Y=NULL > Y$V1=V1 > Y$V2=V2 > Y$V3=V3 > Y=as.data.frame(Y) > > result=NULL > for (i in 1:dim(X)[1]) > { > result=rbind(result, Y$V3[which(Y$V1==as.character(X[i,]$c1) & > Y$V2==as.character(X[i,]$c2))]) > } > > ####### > which.search=function(X,Y,c1,c2,V1,V2,V3) > Y$V3[which(Y$V1==as.character(X$c1) & Y$V2==as.character(X$c2))] > > apply(X,1,which.search,X=X,Y=Y,c1='c1',c2='c2',V1='V1',V2='V2',V3='V3') ........^................^^^... You use X twice in this expression. If you delete 'X=X,' and revise which.search to which.search <- function( X, Y, c1, c2, V1, V2, V3 ) Y$V3[ which( Y$V1==as.character( X[c1] ) & Y$V2 == as.character( X[ c2 ] ) ) ] to get rid of the $ operator which is deprecated for atomic vectors, (and fix the above syntax error) then this expression agrees with 'result' If you know that the matches are unique (only one row in Y will match any row of X), then match( paste( X$c1, X$c2 ) , paste( Y$V1, Y$V2 )) will be fast. If nrow(Y) is small, which( outer(Y$V1, as.character(X$c1), "==" ) & outer(Y$V2, as.character(X$c2), "==" ), arr.ind = TRUE ) will also be quick. Otherwise something like unlist( lapply( paste( X$c1, X$c2 ), match, paste( Y$V1, Y$V2 )) ) may be a good bet. Please learn to use the space key to format your code in a more readable fashion! HTH, Chuck > > ### >> sessionInfo() > R version 2.5.1 (2007-06-27) > i386-pc-mingw32 > > locale: > LC_COLLATE=Dutch_Netherlands.1252;LC_CTYPE=Dutch_Netherlands.1252;LC_MONETARY=Dutch_Netherlands.1252;LC_NUMERIC=C;LC_TIME=Dutch_Netherlands.1252 > > attached base packages: > [1] "stats" "graphics" "grDevices" "utils" "datasets" "methods" > "base" > > ______________________________________________ > R-help@stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > Charles C. Berry (858) 534-2098 Dept of Family/Preventive Medicine E mailto:[EMAIL PROTECTED] UC San Diego http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego 92093-0901 ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.