使`dcast`中的`drop`参数只看公式的RHS
Make the `drop` argument in `dcast` only look at the RHS of the formula
dcast
中的 drop
参数(来自 "reshape2" 或 "dplyr")在从 "long" 到 [=57= 时很有用] 数据集并且您想要为长格式中不存在的组合创建列。
事实证明,使用 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
列。我基本上想从 "long" 到宽”,但在列中添加任何缺失的因子水平(在本例中为“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的值的组合也被展开,就好像我们使用了CJ
或expand.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
知道本质上,"Hey. The combination of values on the LHS are the IDs. Don't try to fill them in for me."
我目前的方法是执行三个步骤,一个用于折叠 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, closes #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
dcast
中的 drop
参数(来自 "reshape2" 或 "dplyr")在从 "long" 到 [=57= 时很有用] 数据集并且您想要为长格式中不存在的组合创建列。
事实证明,使用 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
列。我基本上想从 "long" 到宽”,但在列中添加任何缺失的因子水平(在本例中为“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的值的组合也被展开,就好像我们使用了CJ
或expand.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
知道本质上,"Hey. The combination of values on the LHS are the IDs. Don't try to fill them in for me."
我目前的方法是执行三个步骤,一个用于折叠 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, closes #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