gpt4 book ai didi

r - 检测每个数据帧行与向量中的值之间至少有一个匹配项

转载 作者:行者123 更新时间:2023-12-03 15:07:39 24 4
gpt4 key购买 nike

我的数据框如下所示:

x1 <- c("a", "c", "f", "j")
x2 <- c("b", "c", "g", "k")
x3 <- c("b", "d", "h", NA)
x4 <- c("a", "e", "i", NA)
df <- data.frame(x1, x2, x3, x4, stringsAsFactors=F)

df

x1 x2 x3 x4
1 a b b a
2 c c d e
3 f g h i
4 j k <NA> <NA>
现在我有一个任意向量:
vec <- c("a", "i", "s", "t", "z")
我想将向量值与数据框中的每一行进行比较,并创建一个额外的列,指示是否找到了至少一个(任何)向量值。
生成的数据框应如下所示:
  x1 x2   x3   x4 valueFound
1 a b b a 1
2 c c d e 0
3 f g h i 1
4 j k <NA> <NA> 0
我想在不循环的情况下做到这一点。非常感谢您的支持!
拉米

最佳答案

这将比 apply 更快基于解决方案(尽管它是神秘的结构):

as.numeric(rowSums(`dim<-`(as.matrix(df) %in% vec, dim(df))) >= 1)
[1] 1 0 1 0

更新 - 一些基准

在这里,我们可以制作一些更大的数据来测试......这些基准测试是在 10 万行上进行的。
set.seed(1)
nrow <- 100000
ncol <- 10
vec <- c("a", "i", "s", "t", "z")
df <- data.frame(matrix(sample(c(letters, NA), nrow * ncol, TRUE),
nrow = nrow, ncol = ncol), stringsAsFactors = FALSE)

以下是我们目前采用的方法:
AM <- function() as.numeric(rowSums(`dim<-`(as.matrix(df) %in% vec, dim(df))) >= 1)
NR1 <- function() {
apply(df,1,function(x){
if(any(x %in% vec)){
1
} else {
0
}
})
}
NR2 <- function() apply(df, 1, function(x) any(x %in% vec) + 0)
NR3 <- function() apply(df, 1, function(x) as.numeric(any(x %in% vec)))
NR4 <- function() apply(df, 1, function(x) any(x %in% vec) %/% TRUE)
NR5 <- function() apply(df, 1, function(x) cumprod(any(x %in% vec)))
RS1 <- function() as.numeric(grepl(paste(vec, collapse="|"), do.call(paste, df)))
RS2 <- function() as.numeric(seq(nrow(df)) %in% row(df)[unlist(df) %in% vec])

我怀疑 NR 功能会慢一点:
system.time(NR1()) # Other NR functions are about the same
# user system elapsed
# 1.172 0.000 1.196

同样,理查德的第二种方法:
system.time(RS2())
# user system elapsed
# 0.918 0.000 0.932
grepl而这个 rowSum功能留给基准:
library(microbenchmark)
microbenchmark(AM(), RS1())
# Unit: milliseconds
# expr min lq mean median uq max neval
# AM() 65.75296 67.2527 92.03043 84.58111 102.3199 234.6114 100
# RS1() 253.57360 256.6148 266.89640 260.18038 264.1531 385.6525 100

关于r - 检测每个数据帧行与向量中的值之间至少有一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26735631/

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