【问题标题】:R merging several contingency tables into oneR将几个列联表合并为一个
【发布时间】:2016-04-06 01:02:34
【问题描述】:

我有下面的列联表列表

structure(list(`1` = structure(c(1L, 1L, 1L, 0L, 1L, 0L), .Dim = 2:3, .Dimnames = structure(list(
c("a", "b"), c("x", "y", "z")), .Names = c("", "")), class = "table"), 
`2` = structure(c(1L, 1L, 0L, 1L), .Dim = c(2L, 2L), .Dimnames = structure(list(
    c("b", "c"), c("y", "z")), .Names = c("", "")), class = "table")), .Names = c("1", "2"))

该列表有 2 个列联表,我想将它们合并为一个。我尝试了here 的解决方案,但没有奏效。它给出了以下错误

> tapply(T,names(T),sum)
Error in FUN(X[[1L]], ...) : invalid 'type' (list) of argument

预期的输出是

> table(x[[1]],x[[2]])

   x y z
 a 1 1 1
 b 1 1 0
 c 0 1 1

x 在哪里

structure(list(id = c("a", "a", "a", "b", "b", "c", "c"), upc = c("x","y", "z", "x", "y", "z", "y"), sfactor = c("1", "1", "1", "1","2", "2", "2")), .Names = c("id", "upc", "sfactor"), row.names = c(NA, -7L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x25aa378>)

任何帮助表示赞赏。提前致谢。

【问题讨论】:

    标签: r lapply sapply tapply


    【解决方案1】:

    将您的表格转换为长 data.frames,然后收集计数:

    xtabs(Freq ~ ., data=do.call(rbind, lapply(L, data.frame) ))
    
    #    Var2
    #Var1 x y z
    #   a 1 1 1
    #   b 1 1 0
    #   c 0 1 1
    

    【讨论】:

      【解决方案2】:

      我们也可以使用dcastfun.aggregate 作为sum 在使用rbind 使用list 元素之后使用rbindlist

      library(data.table)
      dcast(rbindlist(lapply(L, as.data.frame)),
                    Var1~Var2, value.var="Freq", sum)
      #   Var1 x y z
      #1:    a 1 1 1
      #2:    b 1 1 0
      #3:    c 0 1 1
      

      如果我们不想要“Var1”列,可以使用acast(来自reshape2

      library(reshape2)
      acast(rbindlist(lapply(L, as.data.frame)), 
                   Var1~Var2, value.var="Freq", sum)
      #   x y z
      # a 1 1 1
      # b 1 1 0
      # c 0 1 1
      

      【讨论】:

        猜你喜欢
        • 2013-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-27
        相关资源
        最近更新 更多