gpt4 book ai didi

regex - 使用正则表达式的 R 子集数据集

转载 作者:行者123 更新时间:2023-12-01 09:28:04 26 4
gpt4 key购买 nike

有没有办法让下面的 R 代码运行得更快(即矢量化以避免使用 for 循环)?

我的示例包含两个数据框。首先是维度 n1*p。 p 列之一包含名称。第二个数据框是一个列向量 (n2*1)。它还包含名称。我想保留第一个数据帧的所有行,其中第二个数据帧的列向量中名称的某些部分出现在相应的第一个数据帧中。对不起,粗暴的解释。

示例(数据框 1):

x        y 
Doggy 1
Hello 2
Hi Dog 3
Zebra 4

示例(数据框 2)
z
Hello
Dog

所以在上面的例子中,我想保留第 1,2,3 行而不是第 4 行。因为“Dog”出现在“Doggy”和“Hi Dog”中。而“你好”出现在“你好”中。排除第四行,因为“你好”或“狗”没有出现在“斑马”中。

下面是我的 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

最佳答案

尝试这个:

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

或者
subset(dat, grepl(paste(z$z, collapse = "|"), x))

关于regex - 使用正则表达式的 R 子集数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19640562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com