代码之家  ›  专栏  ›  技术社区  ›  buhtz

如何绑定多个表

r
  •  2
  • buhtz  · 技术社区  · 7 年前

    我想把两张以上的桌子绑在一起 rbind()

    根据我处理R问题的经验,我确信解决方法很简单。但我不明白。请参阅此示例数据

    # create sample data
    set.seed(0)
    df <- data.frame(A = 0,
                     B1 = sample(c(1:3, NA), 10, replace=TRUE),
                     B2 = sample(c(1:3, NA), 10, replace=TRUE),
                     B3 = sample(c(1:3, NA), 10, replace=TRUE),
                     C = 0)
    
    # names of relevant objects
    n <- names(df)[startsWith(names(df), 'B')]
    

    n )我只想选择一个 data.frame .

    不,我用它们创建表,并将这些行绑定到gether以获得更好的表示。

    t1 <- table(df$B1, useNA="always")
    t2 <- table(df$B2, useNA="always")
    t3 <- table(df$B3, useNA="always")
    
    # this is a workaround
    print( rbind(t1, t2, t3) )
    

    但是我想让这段代码更简单,因为我的实际数据比三个表有更多的表。

    这不管用

    # this is what I "want" but doesn't work
    print( rbind( table(df[,n])) )
    
    # another try
    do.call('rbind', list(table(df[,n])))
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   Ronak Shah    7 年前

    我们可以 lapply table 在他们的个人和连接他们在一起使用 rbind

    do.call("rbind", lapply(df[n], function(x) table(x, useNA = "always")))
    
    #   1 2 3 <NA>
    #B1 1 2 3    4
    #B2 3 3 2    2
    #B3 3 3 1    3
    

    也可以使用 apply margin = 2 (按列)

    t(apply(df[n], 2, function(x) table(x, useNA = "always")))
    
    #   1 2 3 <NA>
    #B1 1 2 3    4
    #B2 3 3 2    2
    #B3 3 3 1    3
    
        2
  •  1
  •   Onyambu    7 年前

    你可以做:

    table(stack(df[n])[2:1],useNA = 'always')[-4,]
        values
    ind  1 2 3 <NA>
      B1 1 2 3    4
      B2 3 3 2    2
      B3 3 3 1    3
    

    如果你不想用[2:1]反转,你可以转置:

    t(table(stack(df[n]),useNA = 'always'))[-4,]
        values
    ind  1 2 3 <NA>
      B1 1 2 3    4
      B2 3 3 2    2
      B3 3 3 1    3
    

    as.data.frame.matrix(table(stack(df[n])[2:1],useNA = 'always')[-4,])
       1 2 3 NA
    B1 1 2 3  4
    B2 3 3 2  2
    B3 3 3 1  3