This might be faster. It uses apply() which is just another way of constructing 
a loop so it is not necessarily faster. We can vectorize the logical 
comparisons, but all() is not vectorized. Use dput() to share your data. That 
makes it easier to replicate your example:

a <- structure(list(V1. = c(1, 1, 1, 0), V2.x = c(1, 0, 1, 0), V3.x = c(0, 
     1, 1, 0), V1.y = c(1, 1, 1, 1), V2.y = c(0, 0, 0, 0), V3.y = c(1, 1, 
     1, 1)), .Names = c("V1.x", "V2.x", "V3.x", "V1.y", "V2.y", "V3.y"),
     row.names = c(NA, -4L), class = "data.frame")

b <- structure(list(V1 = c(1, 1), V2 = c(0, 0), V3 = c(1, 1), V4 = c(1, 
     0), V5 = c(0, 0), V6 = c(0, 0)), .Names = c("V1", "V2", "V3", 
     "V4", "V5", "V6"), row.names = c(NA, -2L), class = "data.frame")

# Generate the row indices that we need so we can vectorize the logical 
operation:
idxa <- rep(1:4, each=2)
idxb <- rep(1:2, 4)
ab <- (a[idxa, ] & b[idxb, ]) == b[idxb, ]
c <- cbind(idxa, idxb)[apply(ab, 1, all), ]
c
#      idxa idxb
# [1,]    2    1
# [2,]    2    2
# [3,]    3    1
# [4,]    3    2

----------------------------------------
David L Carlson
Department of Anthropology
Texas A&M University
College Station, TX 77843-4352




-----Original Message-----
From: R-help <r-help-boun...@r-project.org> On Behalf Of Ulrik Stervbo
Sent: Wednesday, May 2, 2018 3:49 PM
To: Neha Aggarwal <aggarwalneha2...@gmail.com>
Cc: r-help@r-project.org
Subject: Re: [R] using apply

Hi Neha,

Perhaps merge() from base or join from dplyr is what you are looking for.
data. table could also be interesting.

Hth
Ulrik

On Wed, 2 May 2018, 21:28 Neha Aggarwal, <aggarwalneha2...@gmail.com> wrote:

>  Hi
>
> I have 3 dataframes, a,b,c with 0/1 values...i have to check a 
> condition for dataframe a and b and then input the rows ids to 
> datframe c . In the if condition, I AND the 2 rows of from a and b and 
> then see if the result is equal to one of them.
> I have done this using a for loop, however, it takes a long time to 
> execute with larger dataset..Can you help me do it using apply 
> function so that i can do it faster?
>
> a
>   V1.x V2.x V3.x V1.y V2.y V3.y
> 1    1    1    0    1    0    1
> 2    1    0    1    1    0    1
> 3    1    1    1    1    0    1
> 4    0    0    0    1    0    1
>
> b
>   V1 V2 V3 V4 V5 V6
> 1  1  0  1  1  0  0
> 2  1  0  1  0  0  0
>
> c
>              x    y
> 1          2    1
> 2          2    2
> 3          3    1
> 4          3    2
>
> for(i in 1:nrow(a)){
>   for(j in 1:nrow(b)){
>     if(all((a[i,]&b[j,])==b[j,]))
>     { c[nrow(c)+1, ]<-c(paste(i,j)
>       }
>   }
> }
>
>
> Thanks,
> Neha
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 
> 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.
>

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 
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.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.

Reply via email to