我想将两个以上的表与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])))
我的想法哪里出问题了?
答案 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
这也可以将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
答案 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