计算循环中每列的中位数

Posted

技术标签:

【中文标题】计算循环中每列的中位数【英文标题】: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))?我认为一些示例数据会有所帮助。 【参考方案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 函数太执着了。

【讨论】:

以上是关于计算循环中每列的中位数的主要内容,如果未能解决你的问题,请参考以下文章

在大熊猫DataFrame中按组删除异常值的更快方法[重复]

AVX2 列填充计数算法分别在每个位列上

如何将它们添加到字典中,并在python中每5个循环后使活动变量成为结尾?

Matlab中每n个值的中位数

在 python 中将百分位数分布显示为数据框

计算表“营销”中“余额”列的中位数