Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何循环使用列名来计算统计信息?_R_Loops_Variables_Names - Fatal编程技术网

R 如何循环使用列名来计算统计信息?

R 如何循环使用列名来计算统计信息?,r,loops,variables,names,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) 将得到我想要的,但不是如何循环。下面的方法似乎不

假设我有这样的数据

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
}

如果您想在
repair==1时为所有列查找
mean
,我们可以使用
summary\u all
from
dplyr

library(dplyr)

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

# rating repair model
#1    3.5      1   0.5

在base 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 
library(data.table)
setDT(df1)[repair == 1, lapply(.SD, mean, na.rm = TRUE)]
#   rating repair model
#1:    3.5      1   0.5

rep_name使用
data.table
,我们可以

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

#rating repair  model 
# 2      1      1 
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)]

应用
解决方案。可能会很慢:

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

谢谢你的回答,但问题是我实际上有100多个列,有各种各样的名称,我想找到当列1==1、列2==1等的平均评分。不仅仅是修复==1。谢谢@akrun!那么,我还需要输入每个列名吗?我有超过150个,所以我希望不必这样做…@Megan如果你注意到
.SDcols
中的话,我会把列的索引放在
3:ncol(df1)
中。谢谢你的回答,但问题是我实际上有100多个列,有各种各样的名称,我想找到列1==1时的评级列的平均值,列2==1等。不只是修复==1。因此,我需要循环遍历100多个列的名称感谢答案,但问题是我实际上有100多个列,有各种名称,我想找到评级列的平均值,例如,当列1==1,列2==1等,而不仅仅是修复==1。所以我需要循环100+的名字columns@Megan我已经相应地更新了答案,请检查这是否是您所需要的。