2012-03-05 3 views
6

Недавно я столкнулся с пакетом data.table. Я до сих пор не уверен, как выполнять строковые матричные операции. Первоначально он предназначался для обработки таких операций? Например, что такое data.table, эквивалентное apply(M,1,fun)?Матричные операции в строке R

fun следует принять вектор в качестве аргумента, например mean, median или mad.

ответ

4

Я думаю, что вы ищете оператора := (см. ?':='). Ниже приведен краткий пример и сравнение с функцией mapply (надеюсь, что я применил функцию mapply правильно, я использую data.tables в настоящее время, поэтому не обещаю этого, но все же метод data.table работает быстро и в мое мнение легко запомнить):

library(data.table) 
> df <-  data.frame(ID = 1:1e6, 
+      B = rnorm(1e6), 
+      C = rnorm(1e6)) 
> system.time(x <- mapply(foo, df$B, df$C)) 
    user system elapsed 
    4.32 0.04 4.38 
> DT <- as.data.table(df) 
> system.time(DT[, D := foo(B, C)]) 
    user system elapsed 
    0.02 0.00 0.02 
> all.equal(x, DT[, D]) 
[1] TRUE 

После публикации моего ответа, я не уверен, что больше, если это то, что вы ищете. Я надеюсь, что да, просто дайте более подробную информацию, если это не так (например, у вас есть много столбцов, к которым вы хотите применить функцию, а не только два в моем примере?). В любом случае, этот SO post может заинтересовать вас.

+0

tmp <- DT [, D: = sum (B, C)]; tmp [1: 2,] дает общую сумму по всем элементам. Не работает со средним значением. –

+0

http://stackoverflow.com/questions/7885147/efficient-row-wise-operations-on-a-data-table не обобщает ни на какую функцию (среднее значение). –

+0

@ danas.zuokas: Хорошие очки. В таких случаях я предполагаю, что вы просто используете функции 'row ...', например. 'rowSums (DT [, list (B, C)]), но я думаю, что лучше оставить вопрос открытым. –

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