【问题标题】:How can you get table(·) in R to output column names in factor order instead of alphabetic order?如何让 R 中的 table(·) 以因子顺序而不是字母顺序输出列名?
【发布时间】:2020-07-02 21:36:29
【问题描述】:

我有一个变量被解释为 1:3 = c("M","F","NB")。 (这是大型数据框中的一列。)当我用

转换它时
df$gend <- factor(df$Q99,labels=c("M","F","NB"),levels=1:3)

它处理得很好。但是当我将apply(·)FUN=table 一起用于整个data.frame 时,它​​会报告按字母顺序而不是按因子标签排序的结果。

但是,当我尝试在独立的玩具数据集中复制它时:

table(factor(c(1,1,1,1,1,2,3,3,3),labels=c("M","F","NB"),levels=1:3))

结果如预期,按M、F、NB的顺序排列。

我试图通读?table 的帮助,但我无法弄清楚它是如何决定对频率表的输出进行排序(或不排序)的。

如果有关于table(·)apply(·) 的论据,我很想知道它可能是什么。

【问题讨论】:

标签: r


【解决方案1】:

如果 OP 使用 applyMARGIN =2,它会将 data.frame 转换为 matrixfactor 会将其更改为 character。相反,如果我们想在整个数据集上应用table,请使用lapply

lapply(df, table)

可重现的例子

set.seed(24)
df <- as.data.frame(matrix(sample(letters[1:6], 10 *5, replace = TRUE), 10, 5))
df[] <- lapply(df, factor, levels = letters[1:6])

现在,我们使用applylapply 进行测试

apply(df, 2, table)
lapply(df, table)

原因是apply 在后台转换为matrixapply 的源代码)

...

if (is.object(X)) 
        X <- if (dl == 2L) 
            as.matrix(X)
        else as.array(X)
        
 ...

根据?apply

如果 X 不是数组,而是具有非 null 暗值的类的对象(例如数据框),则应用尝试通过 as.matrix 将其强制转换为二维数组(例如, 一个数据框) 或通过 as.array.

这导致删除属性以将列 class 更改为 character

apply(df, 2, class)
#         V1          V2          V3          V4          V5 
#"character" "character" "character" "character" "character" 

lapply(df, class)
#$V1
#[1] "factor"

#$V2
#[1] "factor"

#$V3
#[1] "factor"

#$V4
#[1] "factor"

#$V5
#[1] "factor"

【讨论】:

  • 这非常有效。作为一个单独的查询,我怎么会知道 table(·) 正在将 data.frame 转换为矩阵...我真的没有在帮助页面中看到任何对它的引用。
  • @GreggH 它不是 table 转换为 matrix。它是apply 方法,主要适用于matrix,但也可以在data.frame 上完成
  • @GreggH 在?applyIf X is not an array but an object of a class with a non-null dim value (such as a data frame), apply attempts to coerce it to an array via as.matrix if it is two-dimensional (e.g., a data frame) or via as.array.中指定
猜你喜欢
  • 2012-02-17
  • 1970-01-01
  • 2014-09-25
  • 2010-12-22
  • 2021-10-07
  • 2019-12-07
  • 2020-03-29
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多