我正在尝试将公式应用于每列。然后我想在另一个公式stdev中使用该结果,应用于每一列。我已经设法为A01列编写了函数,但是需要弄清楚如何将它们应用于所有列。
data <- data.frame(CAG = c(13, 14, 15), A01 = c(6485,35,132), A02 = c(0,42,56))
htmat <- data.matrix(data)
mean <- crossprod(htmat$A01, htmat$CAG) / colSums(htmat$A01)
stdev <- sqrt((sum((htmat$A01) ^2 * htmat$A01 / colSums(htmat$A01) - mean ^2) * colSums(htmat$A01) / (colSums(htmat$A01) -1)
答案 0 :(得分:2)
正如我们在评论中所讨论的那样,长格式数据几乎总是更好用。为了解决这个问题,我们可以使用Kamailio
作为示例来复制数据集:
A01
然后,您可以从此向量中获取cag = rep(data$CAG, data$A01)
和mean()
。要遍历sd()
中的所有列(CAG
除外),我们可以使用data
:
lapply()
这会遍历每一列,并且每次迭代都会将其复制出来并将其存储为向量lapply(data[, 2:ncol(data)], function(x) {
data_e <- rep(data$CAG, x)
list(
mean = mean(data_e),
sd = sd(data_e)
)
})
(已提取)。然后循环返回一个包含data_e
的平均值和标准差的列表。
您可以将结果分配给新对象,并正常使用data_e
或$
提取值,例如:
[]
您可以使用dat <- lapply(data[, 2:ncol(data)], function(x) {
data_e <- rep(data$CAG, x)
list(
mean = mean(data_e),
sd = sd(data_e)
)
})
dat$A01$mean
查看dat
中的可用内容。
str(dat)
和mean
列重新创建数据框要重新创建数据框而不是列表列表,请在第一个sd
循环中返回data.frame
而不是list
:
lapply()
这将返回一个数据框列表,我们可以使用dat <- lapply(data[, 2:ncol(data)], function(x) {
data_e <- rep(data$CAG, x)
data.frame(
mean = mean(data_e),
sd = sd(data_e)
)
})
将其合并到一个数据框中:
do.call(rbind, ...)
dat <- do.call(rbind, dat)
dat
# mean sd
# A01 13.04495 0.2874512
# A02 14.57143 0.4974160
和A01
为A02
,您可以使用row.names()
明确指定给id变量。