根据调查结果创建一个表格

时间:2013-11-06 15:46:29

标签: r

我有以下数据,我想知道如何通过base,plyr或其他软件包生成每个响应的频率表。

我的数据:

df = data.frame(id = c(1,2,3,4,5),
                Did_you_use_tv=c("tv","","","tv","tv"),
                Did_you_use_internet=c("","","","int","int"))
df

我可以使用表

运行表并获取任何列的频率
table(df[,2])
table(df[,2], df[,3])

但是,我如何设置数据,使其如下所示。

df2 = data.frame(Did_you_use_tv=c(3), 
                Did_you_use_internet=c(2))
df2

这只是每列频率的摘要。

我将创建交叉表但是考虑到数据的结构,我觉得这可能会更有用。

4 个答案:

答案 0 :(得分:2)

这在概念上类似于@ Tyler的回答。只需取所有不等于""的值的总和:

colSums(!df[-1] == "")
#       Did_you_use_tv Did_you_use_internet 
#                    3                    2 

更新

Stack Overflow用户@juba完成了一些工作on a function called multi.table,如下所示:

multi.table <- function(df, true.codes=NULL, weights=NULL) {
  true.codes <- c(as.list(true.codes), TRUE, 1)
  as.table(sapply(df, function(v) {
    sel <- as.numeric(v %in% true.codes)
    if (!is.null(weights)) sel <- sel * weights
    sum(sel)
  }))
}

该功能是questionr package

的一部分

您的示例中的用法是:

library(questionr)
multi.table(df[-1], true.codes=list("tv", "int"))
#       Did_you_use_tv Did_you_use_internet 
#                    3                    2 

答案 1 :(得分:1)

这是我想到的一种方法:

FUN <- function(x) sum(x != "")
do.call(cbind, lapply(df[, -1], FUN))

##     Did_you_use_tv Did_you_use_internet
## [1,]              3                    2

答案 2 :(得分:1)

这是另一种方法

> do.call(cbind, lapply(df[,-1], table))[-1, ]
      Did_you_use_tv Did_you_use_internet 
                   3                    2 

答案 3 :(得分:0)

使用plyrreshape2

t(dcast(subset(melt(df,id.var="id"), value!=""), variable ~ .))