2013-10-14 2 views
0

Я пытаюсь применить функцию только к определенным строкам, которые соответствуют моим условиям. Я видел из других потоков, что я должен использовать функцию «apply», но я не могу заставить ее работать.
Вот то, что я до сих пор:R: Применение функции только к определенным строкам

a = which(decisionMatrix[,1]>0 & decisionMatrix[,4] < decisionMatrix[,5] & 
      tail(ratios,1)>decisionMatrix[4]) 

Который дает мне номера строк, которые удовлетворяют мои условия.

Затем я использую:

apply(decisionMatrix[10],a,decisionMatrix[,1]/decisionMatrix[,5]) 

То, что я пытаюсь сделать здесь говорят, «для каждой строки, которая удовлетворяет указанным выше условиям, принять первый столбец в этой строке и разделить его на пятую колонну в эту строку и сохранить результат в 10-м столбце этой строки «

Может ли кто-нибудь дать мне совет?

+1

Вы можете использовать 'Ā' для подмножества из вашего объекта "decisionMatrix"(' DMsubset <- decisionMatrix [а,] '), а затем' apply' по строке: «apply (DMsubset, 1, ------)» (где 1 = по строке и ------ = любой расчет, который вы хотите сделать). – A5C1D2H2I1M1N2O1R2T1

ответ

4

Не используйте apply. Для изменения строк на месте, просто сделать:

decisionMatrix[a, 10] <- decisionMatrix[a, 1]/decisionMatrix[a, 5] 
+0

Спасибо всем за ответы! – Mike

3

После комментария Ананды, вы хотите что-то вроде:

apply(decisionMatrix[a,], 1, function(x) x[1]/x[5]) 

Но если вы хотите, чтобы вывод, что-то такого же размера, как ваш вход (например, если вы собираетесь добавить его обратно в Оригинальный объект), вы можете вместо этого хотите применить функцию к каждой строке, а затем подмножество его выход:

out <- apply(decisionMatrix, 1, function(x) x[1]/x[5]) 
out[-a] <- NA 

Как @agstudy указывает последний может быть векторизованы просто делая

out <- decisionMatrix[,1]/decisionMatrix[,5] 

Но у вас может быть более сложная операция, для которой это решение не сработает. Если он работает с вашей операцией, векторное решение становится более чистым и быстрым.

Вы также можете хранить это обратно в исходный и делать это зависит от структуры вашего оригинального :

# If you want to replace an existing column 10: 
decisionMatrix[,10] <- out 

# If you want to column bind the result back to your original matrix: 
decisionMatrix <- cbind(decisionMatrix, out) 
Смежные вопросы