R apply和for循环计算

时间:2017-10-27 13:30:26

标签: r for-loop apply

有人能够解释为什么这个适用无法正常工作?我想通过每行中值的总和来规范化每行中的所有值 - 这样每行的总和= 1但是,当我使用apply函数执行此操作时,答案是不正确的。

data <- data.frame(Sample=c("A","B","C"),val1=c(1235,34567,234346),val2=c(3445,23446,234235),val3=c(457643,234567,754234))

norm <- function(x){
  x/sum(x)}

applymeth <- data
applymeth[,2:4] <- apply(applymeth[,2:4], 1, norm)
rowSums(applymeth[,2:4])

loopmeth <- data
for(i in 1:nrow(data)){
  loopmeth[i,2:4] <- norm(loopmeth[i,2:4])
}
rowSums(loopmeth[,2:4])

感谢。

1 个答案:

答案 0 :(得分:1)

apply()为您提供(在结果中)一列矩阵 - 在您的情况下从逐行输入。你必须转置结果:

applymeth <- data
applymeth[,2:4] <- t(apply(applymeth[,2:4], 1, norm))
rowSums(applymeth[,2:4])

看看

apply(matrix(1:12, 3), 1, norm)

apply()结果的原因是一个惯例:
在矩阵或多维数组中,第一个维度的索引首先运行,然后是第二个维度,依此类推。例如:

array(1:12, dim=c(2,2,3))

所以(没有任何数据重组)apply()会产生一列接着另一列。此行为取决于函数MARGIN=的参数apply()