2012-05-18 67 views
2

我有一些數據,我不知道如何打賭分析。目前它在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

所以,在第一行的第二表, '1 A 5,2'表示對象1對於Size = L/Color = R得分爲5,對於Size = M/Color = B得分爲2,對嗎? – chl

+0

對,在條件A下,但可能有多個Size = M和Color = B的目標。例如,目標20也可能是中等和藍色。 – Justin

回答

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代碼作爲索引SizeColor水平的一種方式,我們需要在最後的data.frame中爲每次重複測量(在第i個主題上)。

更新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單因素方差分析或研究具體的對比。

+0

使用融化是'硬'的一部分。一旦你有兩個正確格式化的表格(即在轉換tab1獲得一個「普通」數據幀後),你可以簡單地使用merge來合併它們。 –

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) 

2.data.table包,你可以改變數據幀的data.table和長格式(其中W獸人一樣與reshape2

dt.melt <- melt(setDT(df1), id=c("user","condition"), 
       variable.factor = FALSE)[, variable := as.numeric(variable)] 

以的SizeColor匹配值添加到長數據與查表加入。表

dt.melt[lut, on = c("variable" = "Target"), nomatch=0] 

或:

lut[dt.melt, on = c("Target" = "variable")] 

結果是既:

dt.melt <- melt(setDT(df1), id=c("user","condition"), 
       variable.factor = FALSE)[, variable := as.numeric(variable) 
             ][lut, on = c("variable" = "Target"), nomatch=0] 

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 

您也可以集中在一個調用綁定此10

隨着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