【问题标题】:reshape2 dcast - values in fun.aggregate tabulatereshape2 dcast - fun.aggregate 表格中的值
【发布时间】:2015-03-16 09:48:43
【问题描述】:

我想将一个长 data.frame 制成表格。以下示例代码创建了一个长 data.frame,其中包含“ID”、“unit”和“mat”列。使用 dcast 我想为每个“垫子”创建一个带有新列的宽格式 data.frame,值应该是 1(这种组合存在)或 0(不,不存在......)。

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(按计划),我现在发现的唯一方法是在长 data.frame 中添加一个附加列,并使用“fun.aggregate = tabulate”作为附加 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。

【问题讨论】:

    标签: r reshape2


    【解决方案1】:

    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) 了解什么被转换为零,什么被转换为一。

    【讨论】:

    • 这对于df.long 中的零值可能有意义,但从描述中我认为这些值应该被指示为存在(即1。)
    • 除了相同的结果之外,这种方法更符合我的初始点,即为“它存在”分配一些值(1),为不存在分配一些值(0),即真假。但是,两种 dcast 解决方案都需要 fill = 0statement,尽管特别是在带有 fun.aggregate = as.logical 的解决方案中,我希望这种功能是内在的。
    • @PJussel 填写的默认选项是NA ,需要改一下
    【解决方案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
    

    【讨论】:

    • 尽管我不完全理解 fun.aggregate 参数的语法,但这个解决方案效果很好!谢谢。 PS:字符串 "function(x) 1" 是 fun
    • 如果您的表达式只有一行代码,则不需要大括号。 fun.aggregate 需要一个函数。这也可以是一个匿名函数(动态定义)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多