【问题标题】:Replacing columns by their sum by an ID variable in data.table (R)用 data.table (R) 中的 ID 变量用它们的总和替换列
【发布时间】:2014-07-29 02:48:57
【问题描述】:

我正在尝试根据 ID 聚合变量的某个子集。我不想将结果存储为新变量,因为总和将替换旧变量。

我正在寻找一种使用 data.table 的简单方法。

目前,我有一个解决方法,我希望尽可能简化它(即单行):

sum_vars <- c("x1","x2","x4")
tempp <- dt[ , lapply(.SD, sum), by=ID, .SDcols=sum_vars]
dt[ , c(sum_vars) := NULL]
dt <- dt[tempp]
rm(tempp)

我遇到的单衬(绕过创建该临时变量)的问题是:

tempp 是与dt 不同大小的数据框——ID 的所有重复项都将被删除。所以这样的事情是行不通的:

dt[ , sum_vars] <- dt[ , lapply(.SD, sum), by=ID, .SDcols=sum_vars]

此外,以下内联合并会创建以 .1 作为后缀的新变量(例如 x1.1):

dt <- dt[dt[ , lapply(.SD, sum), by=ID, .SDcols=sum_vars]]

我希望这样的东西可以工作,但它没有:

dt[ , .SD:=sum(.SD), by=ID, .SDcols=sum_vars]

但这只是创建了一个名为.SD的变量

极简主义数据示例

开始

dt <- structure(list(ID = c(1L, 1L, 2L, 3L), x1 = c(1L, 1L, 1L, 1L), 
                     x2 = c(1L, 2L, 5L, 8L), x3 = c(1L, 3L, 6L, 9L), 
                     x4 = c(1L,  4L, 7L, 2L)), 
                .Names = c("ID", "x1", "x2", "x3", "x4"), 
                class = "data.frame", row.names = c(NA, -4L))
dt
#   ID x1 x2 x3 x4
# 1  1  1  1  1  1
# 2  1  1  2  3  4
# 3  2  1  5  6  7
# 4  3  1  8  9  2

结束

# ID x1 x2 x3 x4
# 1  2   3  4  5
# 1  2   3  4  5
# 2  1   5  6  7
# 3  1   8  9  2

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    请参阅 GitHub 上的 data.table Reference Semantics vignette

    请注意,由于我们允许在只有一列的情况下通过引用分配而不引用列名,如第 2c 节所述,我们不能执行 out_cols := lapply(.SD, max)。这将导致添加一个名为 out_col 的新列。相反,我们应该做 c(out_cols) 或简单地做 (out_cols)。用 ( 包裹变量名足以区分这两种情况。

    您需要将适当的列名向量传递给对:=的调用的LHS

    因此以下应该有效(替换原始数据集中的值)

    dt[,(sum_vars) := lapply(.SD, sum), by = ID, .SDcols = sum_vars]
    

    如果你想保留dt

    dt_sum <- copy(dt)[,(sum_vars) := lapply(.SD, sum), by = ID, .SDcols = sum_vars]
    

    请注意,在这两种情况下,我都将变量名称的向量(:= 的 LHS 上的sum_var)包装在 () 中,以强制对其进行评估(而不是简单地创建一个名为 sum var 的列/p>

    【讨论】:

    • 您能否详细说明分配的内容/如何考虑 := 左侧和右侧发生的情况?你建议的工作,我只是希望尽可能地从中获得更多的普遍性。谢谢!
    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 2010-12-03
    • 2016-03-11
    • 2020-11-27
    • 2020-01-08
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多