分类调查分析 - 数据结构问题

时间:2014-11-16 00:09:02

标签: r plyr

我正在尝试为整个调查运行概率表。我想将这些统计信息导出到csv中,其中每列代表一个问题。我原来的每个问题都是自己的专栏,如下:

print(InternalSurveyPercent)

Q1 Q2 Q3 Q4
1  3  2  Mazda
2  3  4  Ford
3  5  2  Toyota
9  3  2  Hyundai

我希望结果看起来像这样,但对于每一列。

InternalSurveyPercent$Q1 

Q1
1  25%
2  25%
3  25%
4  0%
5  0%
9  25%

我使用这个函数来生成列表(lapply是正确的方法吗?)

InternalSurveyPercent = lapply(InternalSurvey, function(x) prop.table(table(x)))

然后我乘以100,因为它使图形我的数据更容易。

InternalSurveyPercent = sapply(InternalSurveyPercent, "*", 100)

我不确定从哪里开始。我对此时的数据结构非常困惑。

str(InternalSurveyPercent)

List of 4
$ Q1: table [1:5(1d)] 25.00 25.00 25.00 0.00 0.00 25.00
..- attr(*, "dimnames")=List of 1
.. ..$ x: chr [1:5] "1" "2" "3" "4" ...

为什么要返回列表?为什么不是一个包含4个变量(列)的数据框?关于我哪里出错/迷路的想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

似乎人们对输出有不同的解释,建议清楚地重新构建问题和所需的输出。无论如何,这是基于我对这个问题的理解程度的data.table解决方案。

# the data
df <- read.table(text="Q1 Q2 Q3 Q4
1  3  2  Mazda
2  3  4  Ford
3  5  2  Toyota
9  3  2  Hyundai", header=T, as.is=T)

library(data.table)
# one liner to get the %
setDT(df)[,lapply(.SD, function(x) prop.table(table(x))*100)][]
#    Q1 Q2 Q3 Q4
# 1: 25 75 75 25
# 2: 25 25 25 25
# 3: 25 75 75 25
# 4: 25 25 25 25

# If you prefer stitch the result table with the original together, you could:
df2 <- setDT(df)[,lapply(.SD, function(x) prop.table(table(x))*100)]
df[,paste0("Q",(1:4),"%") := df2[,1:4,with=FALSE], with=FALSE][]
#    Q1 Q2 Q3      Q4 Q1% Q2% Q3% Q4%
# 1:  1  3  2   Mazda  25  75  75  25
# 2:  2  3  4    Ford  25  25  25  25
# 3:  3  5  2  Toyota  25  75  75  25
# 4:  9  3  2 Hyundai  25  25  25  25

答案 1 :(得分:0)

这可能会有所帮助。我猜你在Q1-3中有六个选项(即1,2,3,4,5和9)。但是,Q4是一个不同的问题,因为可能没有相同的选项。因此,您将在结果中看到十个选项。

devtools::install_github("hadley/tidyr")
library(tidyr)

# I am following your idea with data provided by @LyzandeR
ana <- lapply(InternalSurvey, function(x) prop.table(table(x)))

bob <- data.frame(t(unnest(lapply(ana, as.data.frame.list))), stringsAsFactors = FALSE)
bob <- replace(bob, is.na(bob), 0)
colnames(bob) <- gsub("X", "Q", colnames(bob))

#          Q1   Q2   Q3   Q4
#X1      0.25 0.00 0.00 0.00
#X2      0.25 0.00 0.75 0.00
#X3      0.25 0.75 0.00 0.00
#X9      0.25 0.00 0.00 0.00
#X5      0.00 0.25 0.00 0.00
#X4      0.00 0.00 0.25 0.00
#Ford    0.00 0.00 0.00 0.25
#Hyundai 0.00 0.00 0.00 0.25
#Mazda   0.00 0.00 0.00 0.25
#Toyota  0.00 0.00 0.00 0.25