2016-07-24 54 views
-2

對不起,因爲這個問題已被問到幾個次,但我仍然無法解決這個問題。在R列中將多列分佈在列上

所以我有一個數據幀的形式:

ID Val Type 
1 10 A 
2 11 A 
2 10 C 
3 10 B 
3 12 C 
4 9 B 

這不是太大的幫助,但你可以使用

library(tidyr) 
test <- data.frame(ID = c(1,2,2,3,3,4), 
        Val = c(10,11,10,10,12,9), 
        Type = c('A', 'A', 'C', 'B', 'C', 'B')) 

我想分割它獲得:

ID A.Type B.Type C.Type A.Val B.Val C.Val 
1 1  0  0  10 0  0 
2 1  0  1  11 0 10 
3 0  1  1  0 10 12 
4 0  0  0  0 9  0 

我知道如何獲得專欄1:4使用:

table(test[, c(1, 3)]) %>% as.data.frame() %>% spread(Type, Freq)

這是過去三年我需要因爲在實際的數據幀值是連續的,不能使用table幫助。

+2

'傳播(試驗,型式,纈氨酸)'? – Axeman

+0

我意識到這是一個可怕的問題,它確實值得被低估。調用這些絕望的時間...... – aayush

回答

3

您正在嘗試與多個值的變量,其中的人實際上是隱含的,所以爲了得到type_...列,您將需要創建者一個新的變量類型,然後使用dcastdata.table包來重塑你的數據:

library(data.table) 
setDT(test) 
dcast(test[, type := 1][], ID ~ Type, value.var = c("type", "Val"),fill = 0) 
# ID type_A type_B type_C Val_A Val_B Val_C 
# 1: 1  1  0  0 10  0  0 
# 2: 2  1  0  1 11  0 10 
# 3: 3  0  1  1  0 10 12 
# 4: 4  0  1  0  0  9  0 

或者你可以使用從基礎R reshape,其中NA需要手動更換:

test$type = 1 
reshape(test, idvar = "ID", timevar = "Type", direction = "wide") 

# ID Val.A type.A Val.C type.C Val.B type.B 
# 1 1 10  1 NA  NA NA  NA 
# 2 2 11  1 10  1 NA  NA 
# 4 3 NA  NA 12  1 10  1 
# 6 4 NA  NA NA  NA  9  1 
+3

另一種方法:'dcast(setDT(test),ID_Type,value.var ='Val',fun.aggregate = list(length,sum))'(正如我使用* v1.9.7 *,我不確定它是否適用於* v1.9.6 *雖然) – Jaap

+1

@ProcrastinatusMaximus不錯的選擇。它也適用於v1.9.6。 – Psidom