R中的条件元素明智划分

时间:2014-02-27 16:06:23

标签: r

我有以下两个矩阵:

> 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的解决方案感兴趣。

谢谢!

3 个答案:

答案 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