gpt4 book ai didi

r - 在 R 中的数据框中搜索行

转载 作者:行者123 更新时间:2023-12-04 11:27:04 27 4
gpt4 key购买 nike

我有一串数字不一定长度相同,例如
0,0,1,2,1,0,0,01,1,0,12,1,2,0,1,0
我已将这些导入到 Re 中的数据框中,例如以上三个字符串将给出以下三行(我将其称为 df ):

enter image description here

我希望编写一些可以帮助我理解数据的函数。作为起点 - 给定一个数值向量 x - 我想要一个“过程”P确定包含 x 的行数作为子向量,例如如果 x = c(2,1)然后 P(x) = 2 , 如果 x = c(0,0,0)然后 P(x) = 1如果 x = c(1,3)然后 P(x) = 0 .我还有更多类似的问题,但我希望我能够从这个问题中汲取逻辑并自己解决一些其他问题。

最佳答案

编辑:正则表达式的方式是:

match.regex <- function(x,data){
xs <- paste(x,collapse="_")
dats <- apply(data,1,paste,collapse="_")
sum(grepl(xs,dats))
}


> match.regex(c(1),dat)
[1] 3
> match.regex(c(0,0,0),dat)
[1] 1
> match.regex(c(1,2),dat)
[1] 2
> match.regex(5,dat)
[1] 0

令人惊讶的是,这个方法比这里给出的其他方法更快,大约是我下面的解决方案的两倍,无论是在小型数据集还是大型数据集上。正则表达式显然得到了很大的优化:
> benchmark(matching(c(1,2),dat),match.regex(c(1,2),dat),replications=1000)
test replications elapsed relative
2 match.regex(c(1, 2), dat) 1000 0.15 1.0
1 matching(c(1, 2), dat) 1000 0.36 2.4

一种立即为您提供数字并更加矢量化的方法如下:
matching.row <- function(x,row){
nx <- length(x)
sid <- which(x[1]==row)
any(sapply(sid,function(i) all(row[seq(i,i+nx-1)]==x)))
}

matching <- function(x,data)
sum(apply(data,1,function(i) matching.row(x,i)),na.rm=TRUE)

在这里,您首先创建一个带有索引的矩阵,这些索引将窗口移动到与要匹配的向量长度相同的行上。然后根据向量检查这些窗口。每一行都遵循这种方法,返回 TRUE 的行的总和就是你想要的。
> matching(c(1),dat)
[1] 3
> matching(c(0,0,0),dat)
[1] 1
> matching(c(1,2),dat)
[1] 2
> matching(5,dat)
[1] 0

关于r - 在 R 中的数据框中搜索行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13951197/

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