R重塑数据 - 在表的一部分上聚合数据以附加到另一部分

时间:2015-09-16 19:09:42

标签: r reshape data-manipulation

我有一些调查数据,我想重新塑造,以便能够使用过滤器进行交互式切片和切块。但是,我陷入了如何以传统方式重塑数据,我无法弄清楚重塑包的适当使用。请帮忙!

数据如下:每个受访者连同每个问题的回答。其他列中是受访者的多个人口统计列。

ID  Q1  Q2  Q3  …   Q30 Demo1   Demo2   Demo3 Average Score
1   1   2   2   …   2   1       1       1     2.5
2   2   3   1   …   5   1       2       1     2.7
3   4   1   5   …   4   2       3       2     1.6
4   1   5   4   …   3   2       1       2     2.5
5   3   4   4   …   1   1       2       2     1.4

目标是重塑数据,使每个独特的问题/人口统计组合都是唯一的,并将该组合的得分平均值/样本作为值。

Question    Demo1   Demo2   Demo3   Average NumResp
1           1       1       1       3.4     2
1           1       1       2       2.3     5
1           1       1       3       3.1     1
…           …       …       …       …       ...
30          4       5       3       1.3     9

作为问题的第2部分,还有一些计算方法可以将1-5级的反应变为“正面”,“中性”或“负面”。将此添加为一个列可以很好地显示该特定人群中所有受访者的百分比,这三个中的任何一个都是三个中的一个,所有3个值加起来达到100%。

Q   Sentiment   Demo1   Demo2   Demo3   Average
1   Positive    1       1       1       3.4
1   Neutral     1       1       1       2.3
1   Negative    1       1       1       3.1
…       …   …   …   …
30  Negative    4       5       3       1.3

非常感谢任何帮助!宁愿在R中这样做,虽然Python也可以。

2 个答案:

答案 0 :(得分:0)

假设你有这样的数据集(make it data.table): ID Q1 Q2 ... Demo1 Demo2 Demo3 1: 1 7 8 2 7 3 2: 2 3 7 6 10 1 3: 3 6 1 5 5 8 4: 4 5 9 10 1 7 5: 5 10 4 8 4 6 和答案分数词典: value Question Score 1: 7 1 17 2: 3 1 6 3: 6 1 19 让变换数据有问题,答案,ID,演示:

d2 <- melt(dt, id.vars=c('ID', 'Demo1', 'Demo2', 'Demo3'), measure.vars=grep('^Q[0-9]+$', colnames(dt), val=T)) d2[, c('Question', 'variable'):=list(substring(variable,2), NULL)] R> d2 ID Demo1 Demo2 Demo3 value Question 1: 1 2 7 3 7 1 2: 2 6 10 1 3 1 3: 3 5 5 8 6 1 现在让我们添加分数: d3 <- merge(d2, vals_enc, by=c('Question', 'value')) 最后得到问题和受众特征的平均得分和受访者: d3[, list(Avg=mean(Score), Number=.N), .(Question,Demo1,Demo2,Demo3)] Question Demo1 Demo2 Demo3 Avg Number 1: 1 6 10 1 6 1 2: 1 10 1 7 18 1 3: 1 5 5 8 19 1

注意: 对于每个Id,存在相同的人口统计状态,因此每个人口统计和问题组合的受访者数量应该相同。

关于问题的第2部分: 你有这样的计算或者你在寻找它们吗?

答案 1 :(得分:0)

使用melt,我们可以指定id变量(分组)或度量变量(折叠为“long”)。参数variable.name允许我们命名通过折叠宽列创建的新变量。 value.name允许我们命名值列。 ?melt.data.frame

的文档提供了所有内容以及更多内容

要创建Sentiment变量,我们使用cut将分数的值范围分解为三分之一。有一个名为labels的参数允许我们选择新值的名称。

library(reshape2)
m <- melt(df, variable.name="Question", value.name="Average", id=c("Demo1", "Demo2", "Demo3"))
m$Question <- gsub("Q", "", m$Question)
a <- aggregate(Average~., m, mean)
a$Sentiment <- cut(a$Average, seq(1,5,length.out=4), labels=c("Negative", "Neutral", "Postive"), include.lowest=T)
#    Demo1 Demo2 Demo3 Question Average Sentiment
# 1      1     1     1        1       1  Negative
# 2      1     2     1        1       2  Negative
# 3      2     1     2        1       1  Negative
# 4      1     2     2        1       3   Neutral
# 5      2     3     2        1       4   Postive
# 6      1     1     1        2       2  Negative
# 7      1     2     1        2       3   Neutral
# 8      2     1     2        2       5   Postive
# 9      1     2     2        2       4   Postive
# 10     2     3     2        2       1  Negative

请注意,我删除了“ID”和“Average.Score”列,因为它们将在此过程中重新计算。

数据

df <- read.table(text="
ID  Q1  Q2  Q3     Q30 Demo1   Demo2   Demo3 Average.Score
1   1   2   2      2   1       1       1     2.5
2   2   3   1      5   1       2       1     2.7
3   4   1   5      4   2       3       2     1.6
4   1   5   4      3   2       1       2     2.5
5   3   4   4      1   1       2       2     1.4", header=T)

df <- df[,!names(df) %in% c("ID", "Average.Score")]