reshape2 dcast - fun.aggregate制表中的值

时间:2015-03-16 09:48:44

标签: r reshape2

我想列出一个很长的data.frame。以下示例代码创建一个long data.frame,其中包含列" ID"," unit"和" mat"。使用dcast我想创建一个宽格式的data.frame,每个" mat"都有新的列,值应该是1(这个组合存在)或0(nope,not there ...)

df.long <- data.frame(ID = c(3, 4, 8, 9, 3, 4, 10, 3, 3, 4),
    unit = c("cm", "cm", "m", "K", "cm", "cm", "m", "cm", "m", "cm"),
    mat = c(1,1,1,1,2,2,2,3,3,3))
dcast(df.long, ID + unit ~ mat)

给我一​​个数据框,看起来如下:

ID unit  1  2  3
1  3   cm  1  2  3
2  3    m NA NA  3
3  4   cm  1  2  3
4  8    m  1 NA NA
5  9    K  1 NA NA
6 10    m NA  2 NA

要使表格填充为1和0(按计划),我现在找到的唯一方法是在long data.frame中添加一个额外的列并使用&#34; fun.aggregate = tabulate&#34;作为附加的dcast参数,即:

df.long <- data.frame(ID = c(3, 4, 8, 9, 3, 4, 10, 3, 3, 4),
    unit = c("cm", "cm", "m", "K", "cm", "cm", "m", "cm", "m", "cm"),
    mat = c(1,1,1,1,2,2,2,3,3,3),
    value = c(1,1,1,1,1,1,1,1,1,1))
dcast(df.long, ID + unit ~ mat, fun.aggregate = tabulate)

ID unit 1 2 3
1  3   cm 1 1 1
2  3    m 0 0 1
3  4   cm 1 1 1
4  8    m 1 0 0
5  9    K 1 0 0
6 10    m 0 1 0

尽管它现在按预期工作,我想知道是否有人有更好的方法只使用dcast功能,而不改变初始data.frame。

2 个答案:

答案 0 :(得分:2)

我认为这可以胜任:

dcast(df.long, ID + unit ~ mat, 
      fill = 0, 
      fun.aggregate = function(x) 1)
#  ID unit 1 2 3
#1  3   cm 1 1 1
#2  3    m 0 0 1
#3  4   cm 1 1 1
#4  8    m 1 0 0
#5  9    K 1 0 0
#6 10    m 0 1 0

答案 1 :(得分:2)

Roland的方法绝对有效,但简单地将as.logical用于聚合函数可能更有意义:

dcast(df.long, ID + unit ~ mat, 
      fill = 0, 
      fun.aggregate = as.logical, 
      value.var =  "mat")
#   ID unit 1 2 3
# 1  3   cm 1 1 1
# 2  3    m 0 0 1
# 3  4   cm 1 1 1
# 4  8    m 1 0 0
# 5  9    K 1 0 0
# 6 10    m 0 1 0

尝试as.logical(-1:3)以了解转化为零的内容以及转换为内容的内容。

相关问题