我有一些数据,我不确定如何分析。目前它在Excel中,需要摆弄才能在R中工作,我相信。我有一套目标,它们的大小和颜色。我也有用户,每个目标的条件和分数。
所以第一个表看起来像这样:
Target, 1, 2, 3, 4, 5 ...
Size, L, M, L, S, L ...
Color R, B, G, B, R ...
然后我拥有所有用户数据,其中包含用户ID列,设备列,然后是每个目标上得分的列。
User, Condition, 1, 2, 3, ...
1 A 5, 2, 8, ...
1 D 2, 4, 6, ...
2 A 1, 4, 6, ...
2 B 5, 8, 3, ...
我主要想在4个条件之间运行ANOVA,所以看看L目标或R目标的平均分数是否相同。
我从来没有必要使用第二个表来过滤或查找这样的数据。我该怎么做?
答案 0 :(得分:2)
快速而肮脏的解决方案(因为我相信有人肯定会提出一个更优雅的解决方案来避免循环):
tab1 <- list(Target=1:5, Size=c("L","M","L","S","L"), Color=c("R","B","G","B","R"))
tab2 <- data.frame(rep(1:2, each=2), c("A","D","A","B"),
c(5,2,1,5), c(2,4,4,8), c(8,6,6,3))
names(tab2) <- c("User", "Condition", 1:3)
library(reshape)
tab2.melt <- melt(tab2, measure.vars=3:5)
for (i in 1:nrow(tab2.melt)) {
tab2.melt$Size[i] <- tab1$Size[tab1$Target==as.numeric(tab2.melt$variable[i])]
tab2.melt$Color[i] <- tab1$Color[tab1$Target==as.numeric(tab2.melt$variable[i])]
}
我假设您可以将数据导入R,但如果数据结构不是您在摘录中显示的数据结构,则可能需要调整上述代码。基本上,我们的想法是将您的Target
代码视为索引Size
和Color
级别的一种方式,我们需要在最终的data.frame
中进行每次重复测量(在主题)。
更新的data.frame
如下:
> head(tab2.melt)
User Condition variable value Size Color
1 1 A 1 5 L R
2 1 D 1 2 L R
3 2 A 1 1 L R
4 2 B 1 5 L R
5 1 A 2 2 M B
6 1 D 2 4 M B
从那里,您可以执行3向ANOVA或研究特定的对比。
答案 1 :(得分:2)
一种可能的替代解决方案是使用数据框加入查找表:
1。一些示例数据(与他的答案中使用的@chl相同,但使用数据框而不是查找值列表):
lut <- data.frame(Target=1:5, Size=c("L","M","L","S","L"), Color=c("R","B","G","B","R"))
df1 <- data.frame(rep(1:2, each=2), c("A","D","A","B"),
c(5,2,1,5), c(2,4,4,8), c(8,6,6,3))
names(df1) <- c("user", "condition", 1:3)
使用 data.table 包2。,您可以将数据框转换为 data.table 和长格式(适用于与 reshape2 )
相同dt.melt <- melt(setDT(df1), id=c("user","condition"),
variable.factor = FALSE)[, variable := as.numeric(variable)]
3。加入查找表,以便将Size
和Color
的匹配值添加到long data.table :
dt.melt[lut, on = c("variable" = "Target"), nomatch=0]
或:
lut[dt.melt, on = c("Target" = "variable")]
两者都导致:
user condition variable value Size Color
1: 1 A 1 5 L R
2: 1 D 1 2 L R
3: 2 A 1 1 L R
4: 2 B 1 5 L R
5: 1 A 2 2 M B
6: 1 D 2 4 M B
7: 2 A 2 4 M B
8: 2 B 2 8 M B
9: 1 A 3 8 L G
10: 1 D 3 6 L G
11: 2 A 3 6 L G
12: 2 B 3 3 L G
您也可以在一次通话中将其绑定在一起:
dt.melt <- melt(setDT(df1), id=c("user","condition"),
variable.factor = FALSE)[, variable := as.numeric(variable)
][lut, on = c("variable" = "Target"), nomatch=0]
通过 dplyr 和 tidyr 的组合,你可以实现同样的目标:
library(dplyr)
library(tidyr)
df.new <- df1 %>%
gather(variable, value, -c(1:2)) %>%
mutate(variable = as.numeric(as.character(variable))) %>%
left_join(., lut, by = c("variable" = "Target"))
将得到相同的结果:
> df.new
user condition variable value Size Color
1 1 A 1 5 L R
2 1 D 1 2 L R
3 2 A 1 1 L R
4 2 B 1 5 L R
5 1 A 2 2 M B
6 1 D 2 4 M B
7 2 A 2 4 M B
8 2 B 2 8 M B
9 1 A 3 8 L G
10 1 D 3 6 L G
11 2 A 3 6 L G
12 2 B 3 3 L G