如何遍历列名以计算统计信息?

时间:2019-03-23 01:16:00

标签: r loops variables names

说我有看起来像这样的数据

rating  repair  model
5        0       1
4        0       0 
2        1       1
5        1       0 

我希望能够找到每次维修== 1时的额定平均值。但是我实际上有200个列名,我想为此这样做而没有遵循特定的模式。我不知道如何遍历这些列。我知道

 mean(dt[dt$repair==1,]$rating, na.rm=T)

会让我得到我想要的东西,但不会得到循环。以下似乎无效。谢谢!

for(name in rep_names){
    dt[paste0('dt$',name)==1,]$rating
}

3 个答案:

答案 0 :(得分:1)

如果您想在mean时为所有列查找repair == 1,我们可以使用summarize_all中的dplyr

library(dplyr)

dt %>%
 filter(repair == 1) %>%
 summarize_all(~mean(., na.rm = TRUE))

# rating repair model
#1    3.5      1   0.5

在基数R中,我们也可以使用colMeans

colMeans(dt[dt$repair == 1,], na.rm = TRUE)

#rating repair  model 
#   3.5    1.0    0.5 

编辑

如注释中所述,如果需要过滤的列数为1,然后取平均值,则可以首先使用列索引或列名选择这些列。例如,假设我们要在此处过滤第2到3列,那么我们可以做到

rep_names <- 2:3
colMeans(df[rowSums(df[rep_names] == 1) == length(rep_names), ])

#rating repair  model 
# 2      1      1 

rep_names可以包含我们要检查1的列名称的列号。

答案 1 :(得分:1)

有了data.table,我们可以做到

library(data.table)
setDT(df1)[repair == 1, lapply(.SD, mean, na.rm = TRUE)]
#   rating repair model
#1:    3.5      1   0.5

更新

基于评论

setDT(df1)[column1 == 1 & column2 == 1, lapply(.SD, mean), .SDcols = 3:ncol(df1)]

答案 2 :(得分:1)

一个apply解决方案。可能会很慢:

apply(df[df["repair"]==1,],2,mean)
# rating repair  model 
#   3.5    1.0    0.5