【问题标题】:Loop Problems vs Apply循环问题与应用
【发布时间】: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]),"/")

标签: r apply


【解决方案1】:

我会推荐阅读这样的好教程:https://www.r-bloggers.com/using-apply-sapply-lapply-in-r/。或者,在此处提问之前尝试查找类似的答案并修改您自己的代码。

不过,你可以试试:

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

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2022-12-05
    • 1970-01-01
    • 2018-11-22
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多