2016-01-26 3 views
0

Я пытаюсь вычислить значения для строк в кадре данных. В принципе у меня есть кадр данных, который содержит 5 столбцов с 0 или 1 (наличие/отсутствие). Я хочу рандомизировать порядок этих значений по этим 5 столбцам, применить вычисления к этим столбцам, повторить это 1000 раз, затем рассчитать среднее значение для каждого расчёта за столбец и затем суммировать эти значения в одно значение для каждой строки.Лучший способ вычисления значений для строк кадра данных

Я пробовал делать это с лапкой и применять, но так или иначе не получил. Мне удалось сделать это с циклом for, но мне интересно, есть ли более короткий/лучший способ сделать это.

Это то, что я закончил с и работает по мере необходимости:

> df <- data.frame(t(replicate(10,sample(c(0,1),5,replace=TRUE)))) 
> df 
    X1 X2 X3 X4 X5 
1 1 1 0 1 1 
2 1 1 1 0 0 
3 0 0 0 1 0 
4 0 1 1 1 0 
5 0 0 1 0 1 
6 0 1 1 1 0 
7 0 0 1 0 1 
8 0 0 0 0 1 
9 1 0 0 1 0 
10 0 1 0 1 1 
> for (i in 1:nrow(df)){ 
+ v<-sum(
+  rowMeans(
+  replicate(1000,{ 
+   sample(as.numeric(df[i,c("X1","X2","X3","X4","X5")]),5, replace=FALSE)*c(5,4,3,2,1) 
+  } 
+  ) 
+ ) 
+ ) 
+ df[i,c("tot")]<-v 
+ } 
> df 
    X1 X2 X3 X4 X5  tot 
1 1 1 0 1 1 12.0184 
2 1 1 1 0 0 8.9786 
3 0 0 0 1 0 3.0138 
4 0 1 1 1 0 9.0013 
5 0 0 1 0 1 6.0196 
6 0 1 1 1 0 9.0227 
7 0 0 1 0 1 5.9837 
8 0 0 0 0 1 3.0063 
9 1 0 0 1 0 6.0069 
10 0 1 0 1 1 9.0032 

ответ

1

apply Использование:

df$tot <- apply(df, 1, function(x) { 
    sum(
    rowMeans(
     replicate(
     1000, sample(x, 5, replace=F)*5:1 
     ) 
    ) 
) 
}) 
+0

THis велик. Я не знаю, почему я не мог заставить его работать. Я предполагаю, что существует так много способов сделать что-то со всем применимым семейством функций, которые я прекратил видеть очевидным. Еще один вопрос, однако, есть способ сделать это с лапкой, потому что тогда я мог бы использовать multicore с mclapply. –

+1

.. как 'lapply (as.data.frame (t (df)), function (x) {...' К сожалению, я никогда не получал многоядерные вещи для работы на моем ПК. – lukeA

+1

Удивительно, что тоже работает. Теперь о многоядерном вызове :). –

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