将函数应用于多个列,索引前一个结果

时间:2017-06-23 10:10:21

标签: r

我正在尝试将公式应用于每列。然后我想在另一个公式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)

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 A01A02,您可以使用row.names()明确指定给id变量。