2016-10-22 52 views
0

有成千上萬個答案,描述如何從廣泛變爲長時間並由特定變量組織。我不知道我不是在纏着我的頭。 我需要組織最初作爲評價者,obs,val1,val2等開始的行進入評價者IRR下的列。將數據重塑爲基於R中變量的長列(針對IRR)

鑑於類似我的數據格式,可以在創建:

r1 <- c('bob', 'sally', "george", "bob", "sally", "george") 
r2 <- c(1,1,1,2,2,2) 
r3 <- c("bad", "good", "good", "good", "good", "bad") 
r4 <- c("bad", "bad", "good", "good", "good", "bad") 
df=data.frame(r1,r2,r3,r4) 
df = setNames(df, c('rater','obs', 'val1', 'val2')) 

我需要將數據組織成基於「評價者」列。凡是工作將是巨大的,特別是如果 'OBS'(觀察數)可以保留,例如,obs1_val1,obs1_val2等

沿着線的東西:

dcast(df, obs ~ rater) 

它創建:

obs bob george sally 
1 1 bad good bad 
2 2 good bad good 

但是,這會聚合並刪除val2的值。

相反,我需要沿着線的東西:

   bob sally george 
    obs1_val1 bad good good 
    obs1_val2 bad bad  good 
    obs2_val1 good good bad 
    obs2_val2 good good bad 

尋找類似的responses,我看到的建議,melt,然後dcast [我真的不希望聚合 - 而只是在堆列]。

由於字符串val1和val2的應該考慮的因素我已經試過:

df$"val1" <- factor(df$val1, levels=c("bad","good")) 
df$"val2" <- factor(df$val2, levels=c("bad","good")) 

無任何影響。獲取:

Aggregation function missing: defaulting to length 

    obs bob george sally 
1 1 2  2  2 
2 2 2  2  2 

這是沒有用的。

+2

'dcast(melt(df,1 :2),變量+ obs〜rater)'或'dcast(熔化(df,1:2),obs +變量〜rater)''如果你想讓它按'obs'排序 –

+0

看着輸出我不確定1:2選擇什麼。 ? – Donnied

+1

前兩欄 –

回答

1

考慮rbinding兩個VAL1VAL2dcast()電話。此外,添加一列以捕獲相應的值val值(因爲它在dcast期間被丟棄)。因此,使用data.frame()

rdf <- rbind(data.frame(val=c("va1"), dcast(df, obs ~ rater, value.var="val1")), 
      data.frame(val=c("va2"), dcast(df, obs ~ rater, value.var="val2"))) 

# val obs bob george sally 
# 1 va1 1 bad good good 
# 2 va1 2 good bad good 
# 3 va2 1 bad good bad 
# 4 va2 2 good bad good 

如果有很多VAL列,lapply()名錄迭代,然後do.call(rbind, ...)

valcols <- names(df)[grep("val", names(df))] 

dfList <- lapply(valcols, function(v) { 
    data.frame(val=c(v), dcast(df, obs ~ rater, value.var=v)) 
})  
rdf <- do.call(rbind, dfList) 

最後呈現字符變量因素中調用as.factor() an sapply()

rdf <- data.frame(sapply(rdf, as.factor)) 
str(rdf) 

# 'data.frame': 4 obs. of 5 variables: 
# $ val : Factor w/ 2 levels "val1","val2": 1 1 2 2 
# $ obs : Factor w/ 2 levels "1","2": 1 2 1 2 
# $ bob : Factor w/ 2 levels "bad","good": 1 2 1 2 
# $ george: Factor w/ 2 levels "bad","good": 2 1 2 1 
# $ sally : Factor w/ 2 levels "bad","good": 2 2 1 2 
1

tidyverse選項。

library(tidyverse) 
df %>% 
    gather(val1, val2, key = "eval", value = "value") %>% 
    spread(key = rater, value = value) 

然後,您可以選擇是完全刪除「OBS」列或使用unite()合併「OBS」和「EVAL」爲一體。

+0

這仍然是'寬'而不是長格式。不在'評估者'下列出。 – Donnied

+0

@Donnied:我同意,但這是OP在他/她的帖子中成功的例子。 – biomiha

+0

誰是OP? – Donnied