我有一个11个变量x 60行的数据帧;条目是双值因子('男性'/'女性')并包含NA。 (每行是一个家庭,最多11个成员。因此列名为'A4M1'......'A4M11'。
将“男性”,“女性”的总数统计为什么的最简单的范例是什么?所以它们可以被描绘出来?理想情况下,我的输出将是长度为2的数字向量,即直接对因子进行操作作为因子,因此我们保留标签。
我一直在尝试重塑,融化,施放,堆叠,制表,制表,整理,求和,聚合,总结,通过,plyr ......
我目前的工作代码是:
> tabulate(stack(colwise(as.numeric)(myData), na.rm=TRUE)$values)
[1] 162 151
这是不好的,因为我不想强制数字和丢失标签。
请参阅下面的答案
table(as.matrix(myData))
也不理想,因为它会丢失因子级别的顺序,并返回标签的字母顺序。
tabulate()
似乎是最合适的fn。要将数据框转换为列表,我使用stack(..., na.rm=TRUE)$values
,这是笨重的但是完成了工作。
但是stack()
并不理想,因为它不适用于因素,所以我必须将其转换为colwise(as.numeric)(myData)
,这会丢弃标签。
我可以将factor(..., labels=c('Male','Female'))
重新应用于tabulate()
的输出,但这只是笨重。
那么,你能做得更好吗?
(使用标准范例,而不是编写特定于案例的代码)
> head(myData)
A4M1 A4M2 A4M3 A4M4 A4M5 A4M6 A4M7 A4M8 A4M9 A4M10 A4M11
1 Female Male Male <NA> Male Male Male <NA> <NA> <NA> <NA>
2 Female Male Male <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
3 Female Male Male <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
4 Female Male Female <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
5 Female Male Male Female Female Male <NA> <NA> <NA> <NA> <NA>
6 Female Male Male <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
7 ...
> str(myData)
'data.frame': 60 obs. of 11 variables:
$ A4M1 : Factor w/ 2 levels "Male","Female": 2 2 2 2 2 2 1 2 2 2 ...
$ A4M2 : Factor w/ 2 levels "Male","Female": 1 1 1 1 1 1 1 1 1 1 ...
$ A4M3 : Factor w/ 2 levels "Male","Female": 1 1 1 2 1 1 2 1 1 2 ...
$ A4M4 : Factor w/ 2 levels "Male","Female": NA NA NA NA 2 NA NA 1 NA 2 ...
$ A4M5 : Factor w/ 2 levels "Male","Female": 1 NA NA NA 2 NA NA 1 NA 2 ...
$ A4M6 : Factor w/ 2 levels "Male","Female": 1 NA NA NA 1 NA NA NA NA NA ...
$ A4M7 : Factor w/ 2 levels "Male","Female": 1 NA NA NA NA NA NA NA NA NA ...
$ A4M8 : Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ...
$ A4M9 : Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ...
$ A4M10: Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ...
$ A4M11: Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ...
答案 0 :(得分:1)
如果您先取消数据,该怎么办? 简单的例子:
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
答案 1 :(得分:0)
如果您放弃将其视为因素数据框的想法,您可以执行以下操作。
> table(as.matrix(myData))
Female Male
151 162
然而,这是不可取的,因为订单现在是不确定的; table()
按标签的字母顺序排序,而不是按级别的数字顺序排序。
一般来说,这会很糟糕;在这里,我们可以使用rev()
:
> rev(table(as.matrix(myData)))
Male Female
248 253