【问题标题】:Create an output matrix or data frame using apply()使用 apply() 创建输出矩阵或数据框
【发布时间】:2017-06-24 02:04:05
【问题描述】:

我有一个频率交叉表,我想使用 rep()apply() 函数为每个样本(A01、A02 等)制作一长列数据,我可以将其用于均值和标准差统计数据。 A01、A02 等列中的数字是 CAG 的频率计数,例如6485 个 13 CAG 计数。

我已设法编写函数以提供正确的结果,但格式似乎不可索引,例如使用sumstats$A01 给出NULL。理想情况下,我还希望输出表中的行和列倒置,所以列是均值、标准差等。

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

【问题讨论】:

    标签: r function matrix apply sapply


    【解决方案1】:

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

    只需运行sumstats &lt;- 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
    

    【讨论】:

    • 谢谢,是的,我想它已经到了。但是,当我尝试在结果表中插入该列时,它会为每个样本(A01、A02 等)放入一个新列,该列中每一行的平均值相同。我尝试使用 sumstats2
    • 并且不要忘记执行 data.frame(t(sumstats2)) 以将其保留为 data.frame,以便您可以使用 $ 进行子集化。否则,您可以只使用sumstats2[,"mean"],它适用于矩阵或数据框
    • 你的最终答案应该是sumstats &lt;- as.data.frame(t(sumstats))
    • 我将它与更大的数据集和更多列一起使用,但我试图在下面给出一个简化版本
    • 非常感谢,现在可以了。不过有一件事。我刚刚添加了一个 mode = mode(data_e).不幸的是,输出是“数字”。请问有没有办法让这个计算工作?
    【解决方案2】:
    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)
    

    【讨论】:

    • 非常感谢,现在可以了。不过有一件事。我刚刚添加了一个 mode = mode(data_e).不幸的是,输出是“数字”。请问有没有办法进行这个计算?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2013-03-30
    • 1970-01-01
    • 2022-11-25
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多