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