我正在尝试为整个调查运行概率表。我想将这些统计信息导出到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个变量(列)的数据框?关于我哪里出错/迷路的想法?
谢谢!
答案 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