【问题标题】:Compute median per column in loop计算循环中每列的中位数
【发布时间】:2018-10-31 06:50:44
【问题描述】:

我有这个循环来计算每列的平均值,这很有效。

for (i in 1:length(DF1)) {     
    tempA <- DF1[i]                                 # save column of DF1 onto temp variable 
    names(tempA) <- 'word'                          # label temp variable for inner_join function
    DF2 <- inner_join(tempA, DF0, by='word')        # match words with numeric value from look-up DF0
    tempB <- as.data.frame(t(colMeans(DF2[-1])))    # compute mean of column
    DF3<- rbind(tempB, DF3)                         # save results togther
}

脚本使用inner_join 的dplyr 包。

  • DF0 是具有 3 列(word、value1、value2、value3)的查找数据库。
  • DF 1 是每个单元格一个单词的文本数据。
  • DF3 是输出。

现在我想计算中位数而不是平均值。使用colMedians function from 'robustbase' 似乎很容易,但我无法让下面的工作。

library(robustbase)

for (i in 1:length(DF1)) {     
    tempA <- DF1[i]
    names(tempA) <- 'word'
    DF2 <- inner_join(tempA, DF0, by='word')
    tempB <- as.data.frame(t(colMedians(DF2[-1])))
    DF3<- rbind(tempB, DF3) 
}

错误信息如下:

colMedians(tog[-1]) 中的错误:参数“x”必须是矩阵。

我尝试在 colMedians 函数之前将 DF2 格式化为矩阵,但仍然收到错误消息:

colMedians(tog[-1]) 中的错误:参数“x”必须是矩阵。

我不明白这里发生了什么。感谢您的帮助!

很高兴提供示例数据和错误回溯,但尽量保持简洁。

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。
  • 您是否尝试过使用 stats 包中的中值函数?
  • 试试colMedians(data.matrix(DF2[-1]))
  • 更改 colMedians 以适用:tempB
  • 为什么*_all* 方法在这里不起作用:mtcars %&gt;% summarise_all(funs(median))?我认为一些示例数据会有所帮助。

标签: r loops median


【解决方案1】:

根据OP的评论,以下解决了问题。
我已向library(dplyr) 添加了一个电话。
我的贡献是colMedians(data.matrix(DF2[-1]), na.rm = TRUE)

library(robustbase)
library(dplyr)

for (i in 1:length(DF1)) {     
    tempA <- DF1[i]
    names(tempA) <- 'word'
    DF2 <- inner_join(tempA, DF0, by='word')
    tempB <- colMedians(data.matrix(DF2[-1]), na.rm = TRUE)
    DF3 <- rbind(tempB, DF3) 
}

【讨论】:

    【解决方案2】:

    偶然发现this answer,它帮助我修复了如下循环:

    DF3Mean <- data.frame()                         # instantiate dataframe 
    DF4Median <- data.frame(                        # instantiate dataframe
    
    for (i in 1:length(DF1)) {     
    tempA <- DF1[i]                                 # save column of DF1 onto temp variable 
    names(tempA) <- 'word'                          # label temp variable for inner_join function
    DF2 <- inner_join(tempA, DF0, by='word')        # match words with numeric value from look-up DF0
    tempMean <- as.data.frame(t(colMeans(DF2[-1]))) # compute mean of column
    DF3Mean <- rbind(tempMean, DF3Mean)             # save results togther
    tempMedian <- apply(DF2[ ,2:4], 2, median)      #compute mean for columns 2,3, and 4 
    DF4Median <- rbind(tempMedian, DF4Median)       # save results togther
    }
    

    我想我对 colMedian 函数太执着了。

    【讨论】:

      猜你喜欢
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 2021-01-31
      • 1970-01-01
      • 2015-07-14
      • 2021-09-09
      相关资源
      最近更新 更多