我的数据集如下:http://dl.dropbox.com/u/822467/Data.csv
我的情况是这样的。我有一系列问题(总共27个),其中响应是二进制的。 0 =否,1 =是,999 =缺失。
我的第一个问题是如何将所有列转换为因子。我可以使用as.factors
一个接一个地完成它们,但它需要永远。
我的第二个问题是我需要一个摘要,将问题作为标题,将“是”和“否”作为第一列,并且每个问题的单元格都填充“是”和“否”的频率。
我还需要另一个带%的数据框。非常感谢我能提供的任何帮助。我已经查看了Hmisc的软件包汇总和摘要,因此无济于事。
答案 0 :(得分:3)
四行代码......
dat <- read.csv("http://dl.dropbox.com/u/822467/Data.csv")
dat[, -1] <- lapply(dat[, -1], factor, levels=c(0, 1, 999),
labels=c("No", "Yes", NA))
xx <- do.call(rbind, lapply(dat[, -1], table, useNA="always"))
cbind(xx, sum=rowSums(xx), prop.table(xx, margin=1))
...产生这个结果:
No Yes <NA> sum No Yes <NA>
Q1 7 57 0 64 0.109375 0.890625 0.000000
Q2 40 22 2 64 0.625000 0.343750 0.031250
Q3 28 36 0 64 0.437500 0.562500 0.000000
Q4 43 18 3 64 0.671875 0.281250 0.046875
Q5 24 39 1 64 0.375000 0.609375 0.015625
Q6 21 42 1 64 0.328125 0.656250 0.015625
Q7 15 49 0 64 0.234375 0.765625 0.000000
Q8 4 60 0 64 0.062500 0.937500 0.000000
Q9 60 4 0 64 0.937500 0.062500 0.000000
Q10 39 25 0 64 0.609375 0.390625 0.000000
Q11 55 8 1 64 0.859375 0.125000 0.015625
Q12 20 44 0 64 0.312500 0.687500 0.000000
Q13 49 15 0 64 0.765625 0.234375 0.000000
Q14 49 15 0 64 0.765625 0.234375 0.000000
Q15 51 13 0 64 0.796875 0.203125 0.000000
Q16 61 3 0 64 0.953125 0.046875 0.000000
Q17 41 23 0 64 0.640625 0.359375 0.000000
Q18 60 4 0 64 0.937500 0.062500 0.000000
Q19 64 0 0 64 1.000000 0.000000 0.000000
Q20 60 4 0 64 0.937500 0.062500 0.000000
Q21 60 4 0 64 0.937500 0.062500 0.000000
Q22 43 21 0 64 0.671875 0.328125 0.000000
Q23 59 4 1 64 0.921875 0.062500 0.015625
Q24 10 54 0 64 0.156250 0.843750 0.000000
Q25 54 9 1 64 0.843750 0.140625 0.015625
Q26 24 39 1 64 0.375000 0.609375 0.015625
Q27 0 0 64 64 0.000000 0.000000 1.000000
答案 1 :(得分:1)
要将所有列设置为因子,您可以使用lapply
并转换回data.frame,因为data.frames与列表非常相似:
tab <- read.csv("Data.csv")
tab <- as.data.frame(lapply(tab, as.factor))
其余的我同意Andrie的评论......你试过table
功能吗?你可能会感兴趣。
答案 2 :(得分:0)
以下是使用reshape2
的另一种解决方案。
dat <- read.csv("http://dl.dropbox.com/u/822467/Data.csv")
dat2 <- setNames(dcast(melt(dat, 1), variable ~ value), c('Q', 'No', 'Yes', NA))
dat2[,-1] = dat2[,-1]/rowSums(dat2[,-1])