【问题标题】:Creating a contingency table using multiple columns in a data frame in R使用R中数据框中的多列创建列联表
【发布时间】:2016-02-01 00:44:38
【问题描述】:

我有一个如下所示的数据框:

structure(list(ab = c(0, 1, 1, 1, 1, 0, 0, 0, 1, 1), bc = c(1, 
1, 1, 1, 0, 0, 0, 1, 0, 1), de = c(0, 0, 1, 1, 1, 0, 1, 1, 0, 
1), cl = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 2)), .Names = c("ab", "bc", 
"de", "cl"), row.names = c(NA, -10L), class = "data.frame")

cl 列表示聚类关联,变量 ab、bc 和 de 携带二进制答案,其中 1 表示是,0 - 否。

我正在尝试创建一个表交叉表簇以及数据框中的所有其他列,即 ab、bc 和 de,其中簇成为列变量。想要的输出是这样的

    1  2  3
 ab 1  3  2
 bc 2  3  1
 de 2  3  1

我尝试了以下代码:

with(newdf, tapply(newdf[,c(3)], cl, sum))

这为我提供了一次只交叉制表一列的值。我的数据框有 1600 多列和 1 个簇列。有人可以帮忙吗?

【问题讨论】:

  • 看来你可以试试aggregate; aggregate(. ~ cl, newdf, sum)?
  • alexis_laz...感谢您的简单执行。这真的很好,但是由于我当前的数据集有 1600 多个变量,因此一次读取所有变量有点困难。

标签: r contingency


【解决方案1】:

使用dplyr 的一种方法是:

library(dplyr)
df %>% 
  #group by the varialbe cl
  group_by(cl) %>%
  #sum every column
  summarize_each(funs(sum)) %>%
  #select the three needed columns
  select(ab, bc, de) %>%
  #transpose the df
  t

输出:

   [,1] [,2] [,3]
ab    1    3    2
bc    2    3    1
de    2    3    1

【讨论】:

    【解决方案2】:

    baseR:

    t(sapply(data[,1:3],function(x) tapply(x,data[,4],sum)))
    #   1 2 3
    #ab 1 3 2
    #bc 2 3 1
    #de 2 3 1
    

    【讨论】:

      【解决方案3】:

      您的数据采用半长半宽格式,而您希望它采用全宽格式。如果我们首先将其转换为全长格式,这是最简单的:

      library(reshape2)
      df_long = melt(df, id.vars = "cl")
      head(df_long)
      #    cl variable value
      # 1   1       ab     0
      # 2   2       ab     1
      # 3   3       ab     1
      # 4   1       ab     1
      # 5   2       ab     1
      # 6   3       ab     0
      

      然后我们可以把它变成宽格式,使用sum作为聚合函数:

      dcast(df_long, variable ~ cl, fun.aggregate = sum)
      #   variable 1 2 3
      # 1       ab 1 3 2
      # 2       bc 2 3 1
      # 3       de 2 3 1
      

      【讨论】:

        【解决方案4】:

        您还可以将tidyr:gatherreshape2::meltxtabs 组合在一起来生成列联表

        library(tidyr)
        xtabs(value ~ key + cl, data = gather(df, key, value, -cl))
        ##     cl
        ## key  1 2 3
        ##   ab 1 3 2
        ##   bc 2 3 1
        ##   de 2 3 1
        

        如果你喜欢使用管道

        df %>%
          gather(key, value, -cl) %>%
          xtabs(value ~ key + cl, data = .)
        

        【讨论】:

          【解决方案5】:

          只需按照 dickoa 写的代码使用 dplyr 的 pivot_longer(取代收集)进行更新:

          library(dplyr)
          
          df %>% 
          pivot_longer(cols = ab:de,
                    names_to = "key",
                    values_to = "value") %>% 
          xtabs(value ~ key + cl, data = .)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-03-18
            • 2015-04-21
            • 1970-01-01
            • 1970-01-01
            • 2020-09-19
            • 2023-02-23
            • 2020-10-06
            • 1970-01-01
            相关资源
            最近更新 更多