【问题标题】:Count occurrences of a string, by row, in a large data frame在大型数据框中按行计算字符串的出现次数
【发布时间】:2026-02-16 08:55:02
【问题描述】:

我正在尝试在大型数据框中逐行计算二进制字符结果:

V1      V2      V3      V4      V5  
Loss    Loss    Loss    Loss    Loss
Loss    Loss    Win     Win     Loss
Loss    Loss    Loss    Loss    Loss

我需要知道的是按行划分的输赢频率。这只是一个简短的示例(大型模拟输出的片段),但对于第 1 行,在 5 次模拟中,我有 5 次失败,第 2 行有 3 次失败和 2 次胜利,等等。

我希望生成一个单独的表格,按行显示赢/输的频率,或者,如果这不起作用,则添加两个新列:一个提供“赢”和“输”的数量每一行。

每一行都是不同的案例,每一列都是该案例的复制品。这显示为具有“Loss”“Win”两个级别的因子数据框。

【问题讨论】:

    标签: r count summarize rowsum


    【解决方案1】:

    这是一个快速的矢量化解决方案(假设您的数据集名为 df

    Loss <- rowSums(df == "Loss") # Count the "Loss" per row
    cbind(Loss, Wins = ncol(df) - Loss) # Subscribe these from the columns numbers and combine
    #      Loss Wins
    # [1,]    5    0
    # [2,]    3    2
    # [3,]    5    0
    

    【讨论】:

    • 非常感谢!我知道这是一个简单的解决方案,我试图让它变得更加复杂。效果很好!
    • @mike:考虑接受答案而不是(并支持那些有帮助的答案)。这是感谢SO的正确方式。 (也可能在阅读后将其标记为已过时...)
    • @mike 之所以有效,是因为== 找到 TRUE/FALSE,rowSums 分别将这些值强制为 1/0。试试看:sum(TRUE, TRUE, FALSE).
    • 整洁,但当存在 NA 时将无法工作。你需要cbind(Loss = rowSums(df=="Loss"), Wins = rowSums(df=="Win"))
    【解决方案2】:

    R为基础的另一种选择:

    stats = function(u){
        win = sum(u=="Win")
        data.frame(Win=win, Loss=length(u)-win)
    }
    
    Reduce(rbind, apply(df, 1, stats))
    
    #  Win Loss
    #1   0    5
    #2   2    3
    #3   0    5
    

    或者更好的一行但非矢量化:

    t(apply(df, 1, function(u) table(factor(u, levels=c("Win","Loss")))))
    
    #     Win Loss
    #[1,]   0    5
    #[2,]   2    3
    #[3,]   0    5
    

    【讨论】:

    • 是的,不幸的是,我没有设法将一列添加到使用 table 制作的列联表中:p 因此使用 dplyr 的解决方案。
    • 我不认为ldply 来自dplyr :) 你在这里使用的是base R + plyr + magrittr
    • %>% 也在 dplyr 中;)但是确实,我忘记了 plyr 导入!
    • 不,它来自magrittrdplyr 只是从那里掩盖它。此外,这种解决方案效率极低(没有冒犯),即使是上面的双循环也会比这个更有效。
    • 哦,好的。我回到了base R,太难过了我不知道一个函数计算向量中的指定元素。