在R中取消堆叠数据帧

在R中取消堆叠数据帧,r,dataframe,reshape2,R,Dataframe,Reshape2,我有一个堆叠的数据帧 a <- c(1,1,1,1,2,2,3,3,3,3,3,4,4,4,4) b <- c(200,201,201,200,220,220,200,220,203,204,204,203,220,200,200) d <- c(500,500,500,500,500,501,501,501,501,501,502,502,502,502,502) f <- c("G","G","M","M", "G","G","M","M","M","G"

我有一个堆叠的数据帧

a <- c(1,1,1,1,2,2,3,3,3,3,3,4,4,4,4)  
b <- c(200,201,201,200,220,220,200,220,203,204,204,203,220,200,200)  
d <- c(500,500,500,500,500,501,501,501,501,501,502,502,502,502,502)  
f <- c("G","G","M","M", "G","G","M","M","M","G","M","G","M","G","G")  
df <- data.frame(a,d,b,f)
它默认为length,因为我没有放置任何聚合函数。然而,我想得到的是

a   d   b col_1 col_2  
1 500 200    G     M  
1 500 201    G     M  
2 500 220    G    NA  
...and so on  
我想通过为特定的
a+d+b
组合转置列
f
,并将其附加到帧,来“加宽”或取消堆叠数据帧。有没有一种不必在组合中循环的优雅方式


编辑:在col
f
中不一定只有两级
G
M
。我只想把
col_1
col_2
col_3
,它将把
f
列转换为每个唯一的
a+d+b
组合。我用for循环完成了它;但对于大数据集来说,这是非常笨拙的。我想让代码更快

抱歉没有说得更清楚。“f”列不一定有两个级别。碰巧,在我的实际数据集中,长度(unique(df$f))是102。然而,对于一个独特的a+d+b组合,我知道不超过3行!我要找的是一种能水平叠加在a+d+b的独特组合上的东西!工作非常出色!非常感谢埃迪。我应该仔细阅读应用函数。有一个问题,为什么有必要将df转换为dt?@satya不必这样说,只是使用数据做起来容易得多。table(也更快)请原谅我的蹩脚问题,但当你说“我有一个堆叠的数据帧”时,“堆叠”是什么意思?在我看来,它就像一个常规的数据帧。有什么区别?
dcast(df, a+d+b ~ f, fun.aggregate = function(x) as.character(x)[1])
#Using f as value column: use value.var to override.
#   a   d   b    G    M
#1  1 500 200    G    M
#2  1 500 201    G    M
#3  2 500 220    G <NA>
#4  2 501 220    G <NA>
#5  3 501 200 <NA>    M
#6  3 501 203 <NA>    M
#7  3 501 204    G <NA>
#8  3 501 220 <NA>    M
#9  3 502 204 <NA>    M
#10 4 502 200    G <NA>
#11 4 502 203    G <NA>
#12 4 502 220 <NA>    M
dcast(df, a+d+b ~ f, fun.aggregate = function(x) as.character(x)[1])
#Using f as value column: use value.var to override.
#   a   d   b    G    M
#1  1 500 200    G    M
#2  1 500 201    G    M
#3  2 500 220    G <NA>
#4  2 501 220    G <NA>
#5  3 501 200 <NA>    M
#6  3 501 203 <NA>    M
#7  3 501 204    G <NA>
#8  3 501 220 <NA>    M
#9  3 502 204 <NA>    M
#10 4 502 200    G <NA>
#11 4 502 203    G <NA>
#12 4 502 220 <NA>    M
library(data.table)
dt = data.table(df)

dt[, lapply(1:3, function(i) as.character(f)[i]), by = list(a, d, b)]
#    a   d   b V1 V2 V3
# 1: 1 500 200  G  M NA
# 2: 1 500 201  G  M NA
# 3: 2 500 220  G NA NA
# 4: 2 501 220  G NA NA
# 5: 3 501 200  M NA NA
# 6: 3 501 220  M NA NA
# 7: 3 501 203  M NA NA
# 8: 3 501 204  G NA NA
# 9: 3 502 204  M NA NA
#10: 4 502 203  G NA NA
#11: 4 502 220  M NA NA
#12: 4 502 200  G  G NA