我有以下两个矩阵:
> dat <- cbind(c(1,1,2,3),c(55,23,65,67))
> dat
[,1] [,2]
[1,] 1 55
[2,] 1 23
[3,] 2 65
[4,] 3 67
> cond <- cbind(c(1,2,3),c(0.9,1,1.1))
> cond
[,1] [,2]
[1,] 1 0.9
[2,] 2 1.0
[3,] 3 1.1
现在,我想将dat
的第2列与cond
的第2列分开,条件是第1列中具有相同值的行。即:
55/0.9
23/0.9
65/1
67/1.1
我如何在R中轻松完成?我也对data.frames
的解决方案感兴趣。
谢谢!
答案 0 :(得分:4)
您可以使用match
执行此操作,假设{1}在第1列中是唯一的:
cond
这比dat[, 2] / cond[match(dat[, 1], cond[, 1]), 2]
# [1] 61.11111 25.55556 65.00000 60.90909
快。它匹配的是merge
中与cond
中的值匹配的值的索引,您可以使用该索引从dat
中检索值。这也适用于数据框。
要了解cond
正在做什么,请尝试查看以下结果:
match
答案 1 :(得分:2)
正如@Anand Mahto建议的那样,合并两个矩阵,然后计算变得简单:
df <- merge(dat, cond, by=1)
df[,2]/df[,3]
答案 2 :(得分:2)
FWIW,
Rgames> cond<-cbind(1:100,runif(100))
Rgames> dat<-cbind(sample(1:100,1e5,rep=TRUE),runif(1e5))
Rgames> library(microbenchmark)
Rgames> microbenchmark(brodie(dat,cond),shadow(dat,cond),times=10)
Unit: milliseconds
expr min lq median uq
brodie(dat, cond) 4.981001 5.411622 6.082569 21.57764
shadow(dat, cond) 289.586938 304.098892 309.919966 353.00062
max neval
72.83944 10
372.19423 10