【问题标题】:apply function removing 0 counts from table() output of ordered factors [duplicate]应用函数从有序因子的 table() 输出中删除 0 个计数
【发布时间】:2022-07-15 23:37:21
【问题描述】:

假设以下 data.frame 包含有序因子列:

dat0 <- data.frame(X1 = 1:5, X2 = 1:5, X3 = c(1,1:4), X4 = c(2,2:5))
dat <- data.frame(lapply(dat0, factor, ordered=TRUE, levels=1:5, labels=letters[1:5]))

我想创建一个漂亮的表格来编译dat 的每一列中有多少 a:e。函数table() 是一个显而易见的选择。

我制作这张桌子的“干净”尝试不起作用。见下文:

table() 函数在应用于单个列时按预期工作(即,包括所有 5 个因素选择——即使一个或多个的计数为 0):

table(dat[,1])

a b c d e 
1 1 1 1 1 

table(dat[,3])

a b c d e 
2 1 1 1 0 

# note: that a 0 is provided for any factor missing

但是,当我尝试在 data.frame 上使用 apply() 函数将所有列计数包含到一个表中时,我得到的结果格式很奇怪:

apply(dat, 2, table)

$X1

a b c d e 
1 1 1 1 1 

$X2

a b c d e 
1 1 1 1 1 

$X3

a b c d 
2 1 1 1 

$X4

b c d e 
2 1 1 1 

我可以通过仅包含我的 data.frame 的列来证明问题的原因,这些列对于列之间相似的每个因素至少有 1 个计数。 (即,我可以通过删除任何因数为 0 的列来获得我想要的格式化结果):

apply(dat[1:2], 2, table) # only including columns of dat with all 5 letters (i.e., no 0 counts)

  X1 X2
a  1  1
b  1  1
c  1  1
d  1  1
e  1  1

问题:使用table() 时是否有简单的解决方法/解决方案,或者我必须找到不同的方法?

  • 注意:我知道我可以简单地 cbind() 单个表结果,但这在我实际更复杂的数据集中非常乏味。

【问题讨论】:

标签: r apply r-factor r-table


【解决方案1】:

我们可以使用droplevels

table(as.data.frame(lapply(dat, droplevels))[,3])
# a b c d 
# 2 1 1 1 

【讨论】:

    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多