R 如何将数据框中的因子总和制成表格,保留标签

R 如何将数据框中的因子总和制成表格,保留标签,r,R,我有一个11个变量x 60行的数据框架;条目是两值因子(“男性”/“女性”),包含NAs。(每一行是一个家庭,最多有11名成员。因此列名称为“A4M1”…“A4M11”) 将“男性”和“女性”的总计数制成表格以便进行条形图的最简单范例是什么?理想情况下,我的输出将是一个长度为2的命名数值向量,也就是说,将因子作为因子直接操作,因此我们保留标签 我一直在尝试重塑,融化,铸造,堆叠,制表,表格,colwise,sum,aggregate,Summary,by,plyr 我目前的工作代码是: >

我有一个11个变量x 60行的数据框架;条目是两值因子(“男性”/“女性”),包含NAs。(每一行是一个家庭,最多有11名成员。因此列名称为“A4M1”…“A4M11”)

将“男性”和“女性”的总计数制成表格以便进行条形图的最简单范例是什么?理想情况下,我的输出将是一个长度为2的命名数值向量,也就是说,将因子作为因子直接操作,因此我们保留标签

我一直在尝试重塑,融化,铸造,堆叠,制表,表格,colwise,sum,aggregate,Summary,by,plyr

我目前的工作代码是:

> tabulate(stack(colwise(as.numeric)(myData), na.rm=TRUE)$values)
[1] 162 151
这很糟糕,因为我不想强制使用数字并丢失标签

见下面我的答案

table(as.matrix(myData))
也不理想,因为它会丢失因子级别的顺序,并返回标签的字母顺序

tablate()
似乎是最合适的fn。要将数据帧转换为一个列表,我使用
堆栈(…,na.rm=TRUE)$values
,它很笨重,但可以完成任务。 但是
stack()
并不理想,因为它对因子不起作用,所以我必须使用
colwise(as.numeric)(myData)
对其进行转换,这会丢弃标签。 我可以将
因子(…,labels=c('Male','Female'))
重新应用到
tablate()
的输出中,但这太笨重了。 那么,你能做得更好吗? (使用标准范例,而不是编写特定于案例的代码)

>头(myData)
A4M1 A4M2 A4M3 A4M4 A4M5 A4M6 A4M7 A4M8 A4M9 A4M10 A4M11
1男1女
2男2女
3男3女
4女-男-女
5女男女男
6女6男
7.
>str(myData)
“数据帧”:60 obs。在11个变量中:
$A4M1:系数w/2级“男性”、“女性”:2 2。。。
$A4M2:系数w/2级“男性”、“女性”:1。。。
$A4M3:系数w/2级“男性”、“女性”:12。。。
$A4M4:系数w/2级“男性”、“女性”:不适用不适用不适用不适用1不适用2。。。
$A4M5:系数w/2级“男性”、“女性”:1不适用2不适用1不适用2。。。
$A4M6:系数w/2级“男性”、“女性”:1不适用1不适用。。。
$A4M7:系数w/2级“男性”、“女性”:1不适用。。。
$A4M8:系数w/2级“男”、“女”:不,不,不,不。。。
$A4M9:系数w/2级“男”、“女”:不,不,不,不。。。
$A4M10:系数w/2级“男”、“女”:不,不,不,不。。。
$A4M11:系数w/2级“男”、“女”:不,不,不,不。。。

如果您放弃将其视为因子数据框架的想法,您可以执行以下操作

> table(as.matrix(myData))

Female   Male 
   151    162 
然而,这是不可取的,因为订单现在是不确定的
table()
按标签的字母顺序排序,而不是按级别的数字顺序排序。 总的来说,这会很糟糕;在这里,我们可以解决
rev()


如果您只是先取消列出您的数据呢? 简单的例子:

test <- data.frame( 
            A4M1=factor(c(1,2,3,1),levels=(1:3),labels=c("one","two","three")),
            A4M2=factor(c(1,2,2,1),levels=(1:3),labels=c("one","two","three"))
             )
…并为您提供所需的表格顺序(即-不按字母顺序):


我可能遗漏了一些东西,但是
表(as.matrix(test))
会满足您的要求吗?当条形图在
barplot(table(as.matrix(test)))中绘制时,它将保留标签。
我已经发布了这一点,并对其不可取的原因进行了评论。级别的数字顺序被丢弃。您可以将顺序恢复为变量中的顺序,如:
table(as.matrix(test))[levels(test$A4M3)]
> rev(table(as.matrix(myData)))

Male Female 
 248    253 
test <- data.frame( 
            A4M1=factor(c(1,2,3,1),levels=(1:3),labels=c("one","two","three")),
            A4M2=factor(c(1,2,2,1),levels=(1:3),labels=c("one","two","three"))
             )
str(unlist(test))
 Factor w/ 3 levels "one","two","three": 1 2 3 1 1 2 2 1
 - attr(*, "names")= chr [1:8] "A4M11" "A4M12" "A4M13" "A4M14" ...
> table(unlist(test))

  one   two three 
    4     3     1