Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R函数确定矩阵中向量的哪一行_R_Matrix - Fatal编程技术网

使用R函数确定矩阵中向量的哪一行

使用R函数确定矩阵中向量的哪一行,r,matrix,R,Matrix,e、 g a1您必须为要签入a1的每一行添加一个变量: a1在%和行和中使用%的解决方案(应该是一种改进方法): 另一种可能是使用rowMeans和==1我很抱歉没有测试早期的解决方案,我希望这对您有用: apply(a1, 1, function(x) which(rowSums(matrix(A1 %in% x, ncol = 2)) == 2)) 一种可能的解决方案是添加行号并将两个矩阵合并为数据表。其优点是数据表针对速度和大数据量进行了优化 首先,将两个矩阵转换为数据表:

e、 g


a1您必须为要签入a1的每一行添加一个变量:


a1在%
行和中使用
%的解决方案(应该是一种改进方法):


另一种可能是使用
rowMeans
==1

我很抱歉没有测试早期的解决方案,我希望这对您有用:

apply(a1, 1, 
      function(x) which(rowSums(matrix(A1 %in% x, ncol = 2)) == 2))

一种可能的解决方案是添加行号并将两个矩阵合并为数据表。其优点是数据表针对速度和大数据量进行了优化

首先,将两个矩阵转换为数据表:

> a11
[1] "13" "12"
> A11
[1] "12" "14" "13" "24"
> which(A11 %in% a11)
[1] 1 3
最后,我们合并两个表(这将返回
A1
的行,其中
A1
中的值出现在中):


使用
应用
复制
的解决方案。想法是使用
apply
循环
A1
中的每一行,使用函数
rbind
将每一行添加到
A1
,并使用
duplicated
any
检查是否存在任何重复项

result[, id]
which(apply(A1, 1, toString) %in% apply(a1, 1, toString))
# [1] 1 3
或者我们可以将所有数字组合成字符串,并匹配
A1
A1
中的字符串。此解决方案的灵感来源于PKumar的解决方案

which(apply(A1, 1, function(x) any(duplicated(rbind(x, a1)))))
# [1] 1 3
测试方法 在Dror Bogin回答的评论部分,OP提出了一个解决方案,即
which(复制(rbind(a1,a1))-nrow(a1)
。此解决方案仅在大型矩阵中没有重复项时有效,例如
A1

例如,考虑以下矩阵,
A2
,它与
A1
相同,只是有三个额外的行,其中两个是重复的

result[, id]
which(apply(A1, 1, toString) %in% apply(a1, 1, toString))
# [1] 1 3
但是我的解决方案仍然会返回
c(1,3)

最后,如果OP确定没有任何重复项。我们可以使用下面的代码来进一步简化代码

which(apply(A2, 1, function(x) any(duplicated(rbind(x, a1)))))
# [1] 1 3
绩效评估 由于OP提到现实世界的矩阵是巨大的,因此值得在此对所有提出的方法进行性能评估

到目前为止,我们共有五种方法

方法1:我提出的“应用重复”方法

方法2:受PKumar启发的“应用到字符串匹配”方法

方法3:PKumar提出的“do.call数据帧匹配”方法

方法4:Dror Bogin提出的“for loop”方法

方法5:tophcito提出的“数据表”方法

下面我使用了
microbenchmark
包来进行性能评估

which(duplicated(rbind(A1, a1), fromLast = TRUE))
# [1] 1 3
库(微基准)
库(数据表)
微基准(m1={其中(应用(A1,1,函数(x)任何(复制(rbind(x,A1ЮЮЮ)))},
m2={其中%apply(A1,1,toString)中的%apply(A1,1,toString)),
m3={which(do.call(“paste0”,data.frame(A1))%in%do.call(“paste0”,data.frame(A1)))},
m4={v1=向量()
适用于(i/1:nrow(A1)){
b=ifelse(全部(a1[1,]==a1[i,]),i,NA)
d=ifelse(全部(a1[2,]==a1[i,]),i,NA)
v1=c(v1,b,d)
}
v1[!is.na(v1)]},

m5={a1_dt非常感谢。因为我有一个大矩阵,使用循环方法会花费一些时间。哪一个矩阵太大?a1矩阵非常大。如果要搜索的矩阵非常大,它应该很好。为什么不直接运行代码并让它运行所需的时间?如果希望它运行得更快,请使用apply变体。非常感谢。我已经用which(复制的(rbind(a1,a1))-nrow(a1)解决了这个问题@PoGibas,它在不同的情况下不起作用,我发现有一些情况下总和不等于2,但是匹配的值,我现在感觉很糟糕。一个非常快速的数据表答案是。也是一个重复的问题,但因为这是唯一好的答案,我不会标记为重复。也许这个问题应该标记为这个问题的重复。
其中(重复(rbind(A1,A1),fromLast=TRUE))
是一个好的。
which(apply(A1, 1, function(x) any(duplicated(rbind(x, a1)))))
# [1] 1 3
which(apply(A1, 1, toString) %in% apply(a1, 1, toString))
# [1] 1 3
A2 <- rbind(c(1, 2), c(1, 4), c(1, 3), c(2, 4), c(5, 8), c(4, 3), c(5, 8))
which(duplicated(rbind(a1 ,A2)))-nrow(a1) 
# [1] 1 3 7
which(apply(A2, 1, function(x) any(duplicated(rbind(x, a1)))))
# [1] 1 3
which(duplicated(rbind(A1, a1), fromLast = TRUE))
# [1] 1 3
library(microbenchmark)
library(data.table)

microbenchmark(m1 = {which(apply(A1, 1, function(x) any(duplicated(rbind(x, a1)))))},
               m2 = {which(apply(A1, 1, toString) %in% apply(a1, 1, toString))},
               m3 = {which(do.call("paste0",data.frame(A1)) %in% do.call("paste0",data.frame(a1)))},
               m4 = {v1 = vector()
               for(i in 1:nrow(A1)){
                 b = ifelse(all(a1[1,] == A1[i,]),i,NA)
                 d = ifelse(all(a1[2,] == A1[i,]),i,NA)
                 v1 = c(v1,b,d)
               }
               v1[!is.na(v1)]},
               m5 = {a1_dt <- as.data.table(as.data.frame(a1))
               A1_dt <- as.data.table(as.data.frame(A1))
               setnames(a1_dt, c("x", "y"))
               setnames(A1_dt, c("x", "y"))
               A1_dt[, id := 1:nrow(A1_dt)]
               result <- merge(A1_dt, a1_dt, by = c("x", "y"))
               result[, id]})

# Unit: microseconds
# expr      min        lq      mean    median       uq      max neval
#   m1  164.498  191.7435  235.6025  215.1320  237.751 1777.094   100
#   m2   71.968   82.2490  101.0790   99.2130  112.064  202.024   100
#   m3  140.851  165.5265  197.3618  185.3175  206.908  395.824   100
#   m4 4734.462 5107.4095 5450.1260 5348.2450 5535.876 8807.847   100
#   m5 1286.684 1394.6360 1591.3651 1508.7560 1674.283 4361.256   100