我有一个数据集,其中包含对几个问题的数值响应。我想知道一个人回答问题的次数为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
答案 0 :(得分:2)
@dww建议的基本R方法非常简单直接。但是,如果您更喜欢dplyr
方法,我们可以使用rowwise
和do
分别计算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
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