3

以下の R コードをより速く実行する方法はありますか (つまり、for ループの使用を避けるためにベクトル化します)?

私の例には 2 つのデータ フレームが含まれています。最初は次元 n1*p です。p 列の 1 つに名前が含まれています。2 番目のデータ フレームは列ベクトル (n2*1) です。名前も含まれています。最初のデータ フレームのすべての行を保持したいのですが、2 番目のデータ フレームの列ベクトルの名前の一部が、対応する最初のデータ フレームに表示されます。残酷な説明で申し訳ありません。

例 (データ フレーム 1):

x        y 
Doggy    1 
Hello    2 
Hi Dog   3 
Zebra    4 

例(データフレーム2)

z
Hello
Dog

したがって、上記の例では、行 1、2、3 を保持したいのですが、4 は保持したくありません。そして「Hello」に「Hello」が登場。「Zebra」には「Hello」または「Dog」の一部がないため、4 行目を除外します。

以下はこれを行うための私のRコードです...正常に動作します。しかし、私の本当の仕事のために。データ フレーム 1 には 100 万行があり、データ フレーム 2 には一致する 50 項目があります。そのため、かなりゆっくりと実行されます。これをスピードアップする方法についての提案は大歓迎です。

x <- c("Doggy", "Hello", "Hi Dog", "Zebra")
y <- 1:4
dat <- as.data.frame(cbind(x,y))
names(dat) <- c("x","y")

z <- as.data.frame(c("Hello", "Dog"))
names(z) <- c("z")

dat$flag <- NA
for(j in 1:length(z$z)){
for(i in 1:dim(dat)[1]){ 

    if ( is.na(dat$flag[i])==TRUE ) {
        dat$flag[i] <- length(grep(paste(z[j,1]), dat[i,1], perl=TRUE, value=TRUE))
    } else {

    if (dat$flag[i]==0) {
        dat$flag[i] <- length(grep(paste(z[j,1]), dat[i,1], perl=TRUE, value=TRUE))

    } else { 

    if (dat$flag[i]==1) {
        dat$flag[i]==1
    }
    }
    }
}
}

dat1 <- subset(dat, flag==1)
dat1  
4

2 に答える 2

7

これを試して:

dat[grep(paste(z$z, collapse = "|"), dat$x), ]

また

subset(dat, grepl(paste(z$z, collapse = "|"), x))
于 2013-10-28T16:58:36.833 に答える