当从“长”数据集转到“宽”数据集并且您想要为列中不存在的组合创建列时,drop中的dcast自变量(来自“ reshape2”或“ dplyr”)非常有用。长表。

事实证明,使用drop也会影响组合的左手边(LHS)和右手边(RHS)。因此,它还会根据LHS值的组合创建额外的行。

有没有办法覆盖这种行为?



以下是一些示例数据:

library(data.table)
DT <- data.table(v1 = c(1.105, 1.105, 1.105, 2.012, 2.012, 2.012),
                 ID = c(1L, 1L, 1L, 2L, 2L, 2L),
                 v2 = structure(c(2L, 3L, 5L, 1L, 2L, 6L),
                                .Label = c("1", "2", "3", "4", "5", "6"),
                                class = "factor"),
                 v3 = c(3L, 2L, 2L, 5L, 4L, 3L))


请注意,“ v2”是具有6个级别的factor列。我本质上想从“长”到“宽”,但要为任何缺失的因子水平添加列(在本例中为“ 4”)。

reshape处理形状,但不处理缺少的列:

reshape(DT, direction = "wide", idvar = c("ID", "v1"), timevar = "v2")
#       v1 ID v3.2 v3.3 v3.5 v3.1 v3.6
# 1: 1.105  1    3    2    2   NA   NA
# 2: 2.012  2    4   NA   NA    5    3


dcast处理添加缺少的列,但仅当LHS上有一个值时:

dcast(DT, ID ~ v2, value.var = "v3", drop = FALSE)
#    ID  1 2  3  4  5  6
# 1:  1 NA 3  2 NA  2 NA
# 2:  2  5 4 NA NA NA  3


如果LHS上有多个值,则LHS上的值的组合也将扩展,就像我们曾经使用过CJexpand.grid一样,但是第2行和第3行对我来说根本不感兴趣:

dcast(DT, ... ~ v2, value.var = "v3", drop = FALSE)
#       v1 ID  1  2  3  4  5  6
# 1: 1.105  1 NA  3  2 NA  2 NA
# 2: 1.105  2 NA NA NA NA NA NA
# 3: 2.012  1 NA NA NA NA NA NA
# 4: 2.012  2  5  4 NA NA NA  3


这类似于在基本R:xtabs中使用ftable(xtabs(v3 ~ ID + v1 + v2, DT))



有没有一种方法可以让dcast本质上知道:“嘿。LHS上的值的组合就是ID。请不要尝试为我填写它们。”

我当前的方法是执行三个步骤,一个步骤是缩小LHS值,另一个步骤是散布RHS值,然后一个步骤将结果合并。

merge(DT[, list(v1 = unique(v1)), .(ID)],  ## or unique(DT[, c("ID", "v1"), with = FALSE])
      dcast(DT, ID ~ v2, value.var = "v3", drop = FALSE),
      by = "ID")[]
#    ID    v1  1 2  3  4  5  6
# 1:  1 1.105 NA 3  2 NA  2 NA
# 2:  2 2.012  5 4 NA NA NA  3


有没有更好的方法,我错过了?

最佳答案

刚刚在data.table开发版本v1.9.7,commit 2113中实现的,关闭#1512

require(data.table) # v1.9.7, commit 2113+
dcast(DT, ... ~ v2, value.var = "v3", drop = c(TRUE, FALSE))
#       v1 ID  1 2  3  4  5  6
# 1: 1.105  1 NA 3  2 NA  2 NA
# 2: 2.012  2  5 4 NA NA NA  3

关于r - 使dcast中的drop参数仅查看公式的RHS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34830908/

10-12 23:24