计算循环中每列的中位数
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 包。
现在我想计算中位数而不是平均值。使用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 %>% 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中按组删除异常值的更快方法[重复]