Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何计算是/否响应并将其分组?_R - Fatal编程技术网

R 如何计算是/否响应并将其分组?

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

我有一个excel文件中的调查,看起来像这样

  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)