【问题标题】:How do I loop through column names to compute statistics?如何遍历列名来计算统计信息?
【发布时间】:2019-08-14 00:51:03
【问题描述】:

假设我有这样的数据

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
}

【问题讨论】:

    标签: r loops variables names


    【解决方案1】:

    apply 解决方案。可能很慢:

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

    【讨论】:

    • 感谢您的回答,但问题是我实际上有 100 多个不同名称的列,我想找到评级列的平均值,例如当第 1 列 ==1、第 2 列= =1 等不只是修复==1。所以我需要遍历 100 多列的名称
    【解决方案2】:

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

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

    更新

    基于 cmets

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

    【讨论】:

    • 感谢您的回答,但问题是我实际上有 100 多个不同名称的列,我想找到当第 1 列 ==1、第 2 列==1 时的平均评分等不只是修复==1。
    • 感谢@akrun!那么我仍然需要输入每个列名吗?我有超过 150 个,所以我希望不必这样做......
    • @Megan 我把列的索引放在3:ncol(df1) 如果你注意到了.SDcols
    【解决方案3】:

    如果您想在repair == 1 时为所有列找到mean,我们可以使用summarize_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 
    

    编辑

    如 cmets 中所述,如果我们需要过滤的列数为 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 的列名的列号。

    【讨论】:

    • 感谢您的回答,但问题是我实际上有 100 多个不同名称的列,我想找到评级列的平均值,例如当第 1 列 ==1、第 2 列= =1 等不只是修复==1。所以我需要遍历 100 多列的名称
    • @Megan 我已经相应地更新了答案,请检查是否是你需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2017-08-22
    • 2021-04-10
    相关资源
    最近更新 更多