我需要一些帮助来组织一系列以csv形式出现的调查问题。 csv就是这种格式。 假设调查问题1有多个答案可供选择,如(a,b,c,d)。在csv中它看起来像这样。
respondent Q1 Q1 Q1 Q1
1 a
2 b
3 c
4 d
5 b
对于每个可能的答案,Q1的输出分布在不同的列上。我想将其转换为:
respondent Q1
1 a
2 b
3 c
4 d
5 b
我的问题不在于将它堆叠在一起,我的意思是我还没弄明白,但我想我可以找到这样做的资源。
我的问题是并非所有的调查问题都遵循这种格式。因此Q2可能占用6列,Q3只占一列等。
一个可能的解决方案,如果我没有更好的东西,我将不得不求助于解决和计算每个问题属于多少列,并通过csv,这些问题的子集并将它们组织成单列。
这是一个可行的解决方案,但是当我得到20个问题时,我不愿意这样做。因此,我想知道是否有办法将问题聚集/分组在一起。
Q1的列名不完全相同,但非常相似。例如:
Q1。今天你感觉怎么样? - 良好。
Q1。今天你感觉怎么样? -Bad。
基本上,我想要完成必须弄清楚有多少列属于Q1,有多少属于Q2的任务。是否可以使用属于同一问题的列标题的相似性,并说这5列属于同一个问题。
谢谢!
答案 0 :(得分:1)
假设您的调查结果都在一个文件中,例如temp.csv:
respondent,Q1,Q1,Q1,Q1,Q2,Q2,Q3,Q4,Q4,Q4
1,a,,,,a,,a,,b,
2,,b,,,,b,a,a,,
3,,,c,,a,,a,,,c
4,,,,d,,b,a,,b,
5,,b,,,,b,a,,b,
下面的代码可以为您提供所需的内容
library(dplyr)
survey <- read.csv("temp.csv",header=F,row.names=1,check.names=F)
group_by(data.frame(t(survey), check.names=F), respondent) %>%
summarise_each(funs(.[.!=""]))
##results
## respondent 1 2 3 4 5
##1 Q1 a b c d b
##2 Q2 a b a b b
##3 Q3 a a a a a
##4 Q4 b a c b b
#to get the orientation as what you want
write.table(t(ans), "answers.csv", sep=",", row.names=T, col.names=F)
read.csv("answers.csv")
如果每个调查问题都在不同的文件中,您可以使用lapply将所有“temp(QN#)。csv”读入列表,然后使用row.names以递归方式合并这些文件。
答案 1 :(得分:0)
考虑基本功能apply()
:
df <- data.frame(df$respondent,
Q1=(apply(df, 1, max)))
# respondent Q1
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 b
对于多列,请考虑使用grep
为类似名称的列绑定应用函数,以回答上述问题:
是否可以使用属于的列标题的相似性 同样的问题?
df <- data.frame(df$respondent,
Q1=apply(df[,grep('Q1', names(df))], 1, max),
Q2=apply(df[,grep('Q2', names(df))], 1, max),
Q3=df$Q3, # ONLY ONE COLUMN (NO APPLY)
Q4=apply(df[,grep('Q4', names(df))], 1, max))