R 如何计算是/否响应并将其分组?
我有一个excel文件中的调查,看起来像这样R 如何计算是/否响应并将其分组?,r,R,我有一个excel文件中的调查,看起来像这样 party question1 question2 1 Republican Yes No 2 Democrat No Yes 3 Libertarian No No 4 Green No Yes 5 Republican
party question1 question2
1 Republican Yes No
2 Democrat No Yes
3 Libertarian No No
4 Green No Yes
5 Republican Yes Yes
6 Constitution Yes No
7 Democrat Yes Yes
8 Democrat No No
party Yes No
Republican 5 4
Democrat 1 3
Libertarian 5 6
Constitution 2 4
Green 4 1
我想知道每个派对的“是”和“否”的号码,比如
party question1 question2
1 Republican Yes No
2 Democrat No Yes
3 Libertarian No No
4 Green No Yes
5 Republican Yes Yes
6 Constitution Yes No
7 Democrat Yes Yes
8 Democrat No No
party Yes No
Republican 5 4
Democrat 1 3
Libertarian 5 6
Constitution 2 4
Green 4 1
最后,我想用这个做一个图表。我一直在到处寻找和尝试一些东西,最近的一个是
res1 <-as.data.frame(aggregate(question1, list(party), table))
这看起来很棒,除了当我查看(res1)时,它只显示为“2个变量中的5个变量”
。我只能看到Group1列和x.No列。
我需要“是”和“否”列,以便可以将它们绘制成图形
我也尝试了plyr
软件包,但它对我不起作用,不知道为什么。
我试着在Rstudio中通过sqldf使用一些CASE
函数来实现它,但是我试着改变它,结果会出错
您可以告诉我,我是一个绝对的初学者,我非常感谢您能给我的任何帮助。我们可以使用
tidyverse
将其转换为“长”格式,使用聚集
,使用“计数”和分散
将其转换为“宽”格式
library(tidyverse)
gather(df1, key, val, question1:question2) %>%
count(party, val) %>%
spread(val, n)
另外,使用
base R
table(data.frame(df1[1], value = unlist(df1[-1])))
以下是重新格式化数据后使用
xtabs
的一种方法
long <- reshape2::melt(df1, id.vars = "party")
xtabs( ~ party + value, long)
# value
#party No Yes
# Constitution 1 1
# Democrat 3 3
# Green 1 1
# Libertarian 2 0
# Republican 1 3
long以下是修复问题中尝试的三种方法(sqldf、aggregate、plyr)的解决方案。我们假设数据帧输入为DF
,如末尾注释中重复定义
1)使用sqldf的sqldf:
library(sqldf)
sqldf("select party,
sum(question1 = 'No') + sum(question2 = 'No') as No,
sum(question1 = 'Yes') + sum(question2 = 'Yes') as Yes
from DF
group by party")
或者,如果您有两个以上的问题,请动态创建SQL语句。verbose=
参数将显示它实际发送给SQLite的语句,如果不需要,可以省略它
library(sqldf)
yes <- paste(sprintf("sum(%s = 'Yes')", names(DF)[-1]), collapse = " + ")
no <- paste(sprintf("sum(%s = 'No')", names(DF)[-1]), collapse = " + ")
fn$sqldf("select party, $no No, $yes Yes from DF group by party", verbose = TRUE)
或者,如果有两个以上的问题:
Count_No <- function(data) sum(data[, -1] == "No")
Count_Yes <- function(data) sum(data[, -1] == "Yes")
ddply(DF, .(party), c(No = Count_No, Yes = Count_Yes))
注
可复制形式的输入DF
:
Lines <- "
party question1 question2
1 Republican Yes No
2 Democrat No Yes
3 Libertarian No No
4 Green No Yes
5 Republican Yes Yes
6 Constitution Yes No
7 Democrat Yes Yes
8 Democrat No No"
DF <- read.table(text = Lines)
行根据示例,共和党人不算5是4否。是基于其他一些dat表的预期输出
解决方案,特别是,看起来非常直接。建议使用此变体以避免警告:table(data.frame(party=df1[[1]],value=unlist(df1[-1]))
library(plyr)
ddply(DF, .(party), summarize,
No = sum(question1 == 'No') + sum(question2 == 'No'),
Yes = sum(question1 == 'Yes') + sum(question2 == 'Yes'))
Count_No <- function(data) sum(data[, -1] == "No")
Count_Yes <- function(data) sum(data[, -1] == "Yes")
ddply(DF, .(party), c(No = Count_No, Yes = Count_Yes))
ddply(yesNo, .(party = DF$party), colSums)
Lines <- "
party question1 question2
1 Republican Yes No
2 Democrat No Yes
3 Libertarian No No
4 Green No Yes
5 Republican Yes Yes
6 Constitution Yes No
7 Democrat Yes Yes
8 Democrat No No"
DF <- read.table(text = Lines)