【问题标题】:How to count by row across specific columns in R?如何跨 R 中的特定列按行计数?
【发布时间】:2014-04-29 13:27:38
【问题描述】:

我有一个如下所示的数据框,其中每一行是一个人,每一列是一个编码为 0,1 的答案:

data<-as.data.frame(cbind('answer1' = c(0,0,1,0,0,0), 
'answer2' = c(1,1,1,1,1,0),
'answer3' = c(1,1,1,0,1,1), 
'answer4' = c(1,0,0,0,0,0)))

我想做的是为每个人计算仅某些列中“1”的数量,并按列名而不是数字来引用这些列。在这种情况下,“只计算 1 在“answer1”和“answer3”中出现的次数。”所以我想最终得到一些看起来像这样的东西:

data<-as.data.frame(cbind('answer1' = c(0,0,1,0,0,0), 
'answer2' = c(1,1,1,1,1,0), 
'answer3' = c(1,1,1,0,1,1), 
'answer4' = c(1,0,0,0,0,0), 
'sum' = c(1,1,2,0,1,1)))

我搜索并发现了许多相关问题,但没有一个解决仅计算某些列并按名称引用这些列的具体问题。我已经尝试过 rowSums 并且可以使用它对所有列求和,但似乎无法让它只选择某些列。我敢肯定有一个非常简单的答案,但它躲避我......谢谢!

编辑:我需要实际计算“1”的实例数,而不是简单地对两列求和,因为实际数据框中的某些行将包含 1 或 0 以外的值,这会干扰使用简单的总结。因此,示例数据框应该看起来像这样:

data<-as.data.frame(cbind('answer1' = c(0,0,1,0,2,0), 
'answer2' = c(1,1,1,1,1,0), 
'answer3' = c(1,1,1,0,1,1), 
'answer4' = c(1,0,0,0,0,0)))

【问题讨论】:

    标签: r


    【解决方案1】:

    更新

    根据您的编辑,尝试:

    > rowSums(data[c("answer1", "answer3")] == 1)
    [1] 1 1 2 0 1 1
    

    原答案

    是的,rowSums 就是你想要的:

    > data$sum <- rowSums(data[c("answer1", "answer3")])
    > data
      answer1 answer2 answer3 answer4 sum
    1       0       1       1       1   1
    2       0       1       1       0   1
    3       1       1       1       0   2
    4       0       1       0       0   0
    5       0       1       1       0   1
    6       0       0       1       0   1
    

    但是,还有许多其他方法。 within(或transform)有时可以很好地解决这些类型的问题:

    within(data, {
      sum <- answer1 + answer3
    })
    

    【讨论】:

    • 谢谢,但这与我需要的略有不同。我不能只求和,而是需要计数 1。我应该更清楚,因为在某些行中可能有其他值会干扰仅使用“sum”。所以我需要它来实际计算“1”的实例,而不仅仅是对列求和。 (我已经编辑了原始问题以反映这一点。)
    • @user3585433,然后是rowSums(data[c("answer1", "answer3")] == 1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    相关资源
    最近更新 更多