如何绑定多个表

时间:2018-08-30 07:59:15

标签: r

我想将两个以上的表与R中的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的一组对象。

不,我无法从中创建表格并将表格中的行绑定到更好的显示方式。

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 个答案:

答案 0 :(得分:2)

我们可以在选定的列上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

这也可以将applymargin = 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

答案 1 :(得分:1)

您可以这样做:

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

如果您希望将其作为data.frame:

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