2017-02-15 19 views
1

Я знаю, что функции * apply являются более эффективным методом, чем циклирование при обработке данных, но я изо всех сил стараюсь сделать это в течение одной повторяющейся ситуации. Возьмите этот простой пример:Loop Problems vs Apply

Для этого data.frame «myTNorm» ...

> str(myTNorm) 
'data.frame': 4631 obs. of 12 variables: 
$ nc101_code: chr "NC101_00003" "NC101_00004" "NC101_00005" "NC101_00006" ... 
$ D2_01  : num 5.67e-04 5.17e-05 2.50e-04 8.79e-04 8.61e-06 ... 
$ D2_02  : num 1.83e-04 1.26e-05 3.35e-04 5.05e-04 1.89e-05 ... 

Я хочу, чтобы просто заменить значение каждой ячейки для указанных столбцов 2: 6 с нормированным значением (т.е. CellValue/сумма (столбец)).

Я чувствую, что должен быть хороший способ использовать * применять с некоторой функцией, чтобы сделать это красиво, но может заставить его работать как цикл for. Может кто-то, пожалуйста, поделитесь соответствующим синтаксисом!

for (i in 2:6) 
{ 
    myTNorm[, i] = myTNorm[, i]/sum(myTNorm[, i]) 
} 

Спасибо!

+0

Если вы посмотрите вокруг сообщения на петлях против * применяются вопросы, вы увидите множество комментариев и даже полных примеров, показывающих, что * применять методы не всегда лучше, чем 'для 'петли. Для вашего вопроса 'myTNorm [, 2: 6] <- lapply (2: 6, function (i) i/sum (i))', вероятно, является стандартным * применимым решением. – lmo

+1

@ Я думаю, что вторая часть должна быть 'lapply (myTNorm [, 2: 6], ...)' – Shape

+0

@Shape. Вы правы, конечно. Спасибо, что поймал это. – lmo

ответ

0

Я бы рекомендовал прочитать хороший учебник, подобный этому: https://www.r-bloggers.com/using-apply-sapply-lapply-in-r/. Или попробуйте найти похожие ответы и адаптировать свой собственный код, прежде чем задавать здесь вопрос.

Однако, вы можете попробовать:

apply(X = myTNorm[,2:6], MARGIN = 2, FUN = function(x) x/sum(x)) 

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

  • Нет связанных вопросов^_^