说我有看起来像这样的数据
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
}
答案 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