使用apply()创建输出矩阵或数据框

时间:2017-06-24 02:04:06

标签: r function matrix apply sapply

我有一个频率交叉表,并希望rep()使用apply()函数为我可以使用的每个样本(A01,A02等)创建一长列数据对于均值和stdev统计。列A01,A02等中的数字是CAG的频率计数,例如, 6485计数13 CAG。

我已设法编写函数以提供正确的结果,但格式似乎不是可索引的,例如使用sumstats$A01可获得NULL。理想情况下,我也喜欢在输出表中反转的行和列,因此列是mean,sd等。

data <- data.frame(CAG = c(13, 14, 15), A01 = c(6485,35,132), A02 = c(0,42,56))
sumstats <- sapply(data[, 2:ncol(data)], function(x) {
data_e <- rep(data$CAG, x)

list(
  mean = mean(data_e),
  median = median(data_e),
  sd   = sd(data_e)
)
 })

#Output:
#sumstats$A01
#NULL

2 个答案:

答案 0 :(得分:1)

$子集对于data.frame类是唯一的。如果你检查class(sumstats),你会发现它只是一个简单的矩阵。

只需运行sumstats <- as.data.frame(sumstats)然后即可使用

sumstats$A01
#$mean
#[1] 13.04495
#
#$median
#[1] 13
#
#$sd
#[1] 0.2874512

这是你想要的吗?

修改

sumstats2 <- as.data.frame(t(sumstats))
res <- data.frame(samples, sumheight, sumstats2)
res
#    samples sumheight     mean median        sd
#A01     A01      6652 13.04495     13 0.2874512
#A02     A02        98 14.57143     15  0.497416

答案 1 :(得分:0)

data <- data.frame(CAG = c(13, 14, 15), A01 = c(6485,35,132), A02 = c(0,42,56))

samples <- c('A01', 'A02')
sumheight <- colSums(data[ , 2:ncol(data)], na.rm=TRUE)

sumstats <- sapply(data[, 2:ncol(data)], function(x) {
  data_e <- rep(data$CAG, x)

  list(
    mean = mean(data_e),
    median = median(data_e),
    sd   = sd(data_e)
  )
})


sumstats2 <- as.data.frame(t(sumstats))
res <- data.frame(samples, sumheight, sumstats2$mean)