有人能够解释为什么这个适用无法正常工作?我想通过每行中值的总和来规范化每行中的所有值 - 这样每行的总和= 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])
感谢。
答案 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()
。