【发布时间】:2017-02-15 19:01:40
【问题描述】:
我知道在处理数据时,*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/sum(column))。
我觉得应该有一个很好的方法来使用 *apply 和一些函数来很好地做到这一点,但只能让它作为一个 for 循环工作。有人可以分享正确的语法吗!
for ( i in 2:6 )
{
myTNorm[, i] = myTNorm[, i]/sum(myTNorm[, i])
}
谢谢!
【问题讨论】:
-
如果您查看有关 Loops 与 *apply 问题的帖子,您会看到大量 cmets 甚至完整的示例表明 *apply 方法并不总是比
for循环更好。对于您的问题,myTNorm[, 2:6] <- lapply(2:6, function(i) i / sum(i))可能是标准的 *apply 解决方案。 -
@Imo 我认为第二部分应该是
lapply(myTNorm[, 2:6], ...) -
@Shape 你是对的,当然。感谢您了解这一点。
-
scale(df[,2:6],center=FALSE,scale=colSums(df[,2:6]))之类的东西可能会很好地传达意图。这只是sweep(df[,2:6],2,colSums(df[,2:6]),"/")