计算具有特定值的行中的列数

时间:2018-10-05 01:39:19

标签: r dplyr

我有一个数据集,其中包含对几个问题的数值响应。我想知道一个人回答问题的次数为1,2 ...

以下是数据示例:

df=data.frame("Person"=c("person a", "person b"),
              "Q1"=c(2,2),"Q2"=c(1,2),"Q3"=c(1,1))

看起来像这样:

 Person    Q1 Q2 Q3
 person a  2  1  1
 person b  2  2  1

我想要这个,并且希望使用dplyr:

 Person    Q1 Q2 Q3  Total.1  Total.2
 person a  2  1  1   2        1
 person b  2  2  1   1        2

3 个答案:

答案 0 :(得分:2)

@dww建议的基本R方法非常简单直接。但是,如果您更喜欢dplyr方法,我们可以使用rowwisedo分别计算1和2的出现。

library(dplyr)

df %>%
  rowwise() %>%
  do( (.) %>% as.data.frame %>% 
             mutate(Total.1 = sum(.==1), 
                    Total.2 = sum(.==2)))

# Person      Q1    Q2    Q3 Total.1 Total.2
#  <fct>    <dbl> <dbl> <dbl>   <int>   <int>
#1 person a     2     1     1       2       1
#2 person b     2     2     1       1       2

使用apply

的基本R方法
df[c("Total.1", "Total.2")] <- t(apply(df, 1, function(x) c(sum(x==1), sum(x==2))))

df
#    Person Q1 Q2 Q3 Total.1 Total.2
#1 person a  2  1  1       2       1
#2 person b  2  2  1       1       2

答案 1 :(得分:2)

不需要dplyr。在基数R中非常简单

df = cbind(df, Total.1 = rowSums(df[,-1]==1), Total.2 = rowSums(df[,-1]==2))

答案 2 :(得分:0)

这是tidyverse

的一个选项
library(tidyverse)
df %>% 
   mutate(Total = pmap(.[-1],  ~ 
              c(...) %>% 
                paste0("Total.", .) %>%
                table %>%
                as.list %>% 
                as_tibble )) %>%
#       unnest
#    Person Q1 Q2 Q3 Total.1 Total.2
#1 person a  2  1  1       2       1
#2 person b  2  2  1       1       2

或者另一种方式是

df %>%
   mutate(Total = pmap(.[-1], ~
                    c(...) %>% 
                     table %>%
                     toString)) %>% 
   separate(Total, into = c("Total.1", "Total.2"))
#    Person Q1 Q2 Q3 Total.1 Total.2
#1 person a  2  1  1       2       1
#2 person b  2  2  1       1       2