2014-02-27 2 views
0

Я следующие две матрицы:Условный поэлементно разделение в 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 

Теперь, я хотел бы разделить столбец 2 из dat с колонке 2 cond условной на строк, имеющих одинаковое значение в столбце 1 То есть:

55/0.9 
23/0.9 
65/1 
67/1.1 

Как это сделать легко в R? Меня также интересуют решения для data.frames.

Спасибо!

ответ

4

Вы можете сделать это с match предполагая cond является уникальным в колонке 1:

dat[, 2]/cond[match(dat[, 1], cond[, 1]), 2] 
# [1] 61.11111 25.55556 65.00000 60.90909 

Этот будет быстрее, чем merge. В каком совпадении он находит индекс значений в cond, которые соответствуют значению в dat, которые затем можно использовать для извлечения значений из cond. Это также будет работать с кадрами данных.

Чтобы понять, что match делает, попробуйте посмотреть на результат:

match(dat[, 1], cond[, 1]) 
+0

Спасибо за быстрые ответы. Именно то, что мне нужно. – Mace

2

Как предложил @Anand Mahto, объединить две матрицы, то расчет становится простым:

df <- merge(dat, cond, by=1) 
df[,2]/df[,3] 
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 
+0

+1, Спасибо за тесты. Обычно улучшение составляет порядка ~ 10x, но я думаю, что накладные расходы убивают «слияние» на небольших слияниях, подобных этому. – BrodieG

Смежные вопросы