【问题标题】:Create a table from survey results根据调查结果创建表格
【发布时间】:2013-11-07 01:35:23
【问题描述】:

我有以下数据,我想知道如何通过 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

这只是每列频率的摘要。

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

【问题讨论】:

    标签: r


    【解决方案1】:

    这在概念上与@Tyler 的答案相似。只取所有不等于""的值的总和:

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

    更新

    Fellow 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 是有形的。
    【解决方案2】:

    这是我想到的许多方法中的一种:

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

    【讨论】:

      【解决方案3】:

      这是另一种方法

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

      【讨论】:

        【解决方案4】:

        使用plyrreshape2

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

        【讨论】:

          猜你喜欢
          • 2013-01-15
          • 2021-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-08
          相关资源
          最近更新 更多