2016-07-24 56 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