在大型数据框中按行计算字符串的出现次数

时间:2015-01-08 21:45:56

标签: r count summarize rowsum

我试图在大数据框中按行计算二进制字符结果:

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

我需要知道的是按行输赢的频率。这只是一个简短的例子(大型模拟输出的片段),但对于第1行,在五次模拟中,我有五次损失,第二行三次丢失,两次获胜等。

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

每一行都是不同的情况,每一列都是该案例的复制品。这显示为具有两个级别“损失”“赢”的因素的数据框。

2 个答案:

答案 0 :(得分:8)

这是一个快速矢量化解决方案(假设您的数据集名为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

答案 1 :(得分:1)

基础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