当前位置: 首页 > 知识库问答 >
问题:

在data.table中有没有一种方法可以使用对象来折叠/汇总变量?SDcols?

匡旭东
2023-03-14

我有一个包含多个变量的数据集,我想使用data.table折叠/汇总(取决于你的背景是更Stata还是整洁),而不必在执行此操作的代码中命名每个单独的变量。

以下是一些示例数据:

library(data.table)

dt <- data.table(v1 = c(1,2,5,8,5,9, NA),
                 v2 = c(5,3,6,1, NA,7,8),
                 year = c(1,1,2,3,3,3,4))

dt
    v1 v2 year
1:  1  5    1
2:  2  3    1
3:  5  6    2
4:  8  1    3
5:  5 NA    3
6:  9  7    3
7: NA  8    4

这是我想要的最终数据集:

# this is the final data we want:
dt[, .(newv1 = sum(v1, na.rm = TRUE),
       newv2 = sum(v2, na.rm = TRUE)),
   by = 'year']

    year newv1 newv2
1:    1     3     8
2:    2     5     6
3:    3    22     8
4:    4     0     8

实际数据集中有许多我想总结的变量,因此我想在预先折叠之外的列表中命名变量,然后以系统的方式命名它们,例如:

# but we want to do it with objects e.g.:
vars.to.collapse <- c('v1', 'v2')
new.v.names <- paste0('new', vars.to.collapse)

new.v.names
[1] "newv1" "newv2"

我知道你可以做这种事情——也就是说,使用对象创建多个变量——使用。SD当你使用:=运算符添加/修改变量时,但是我找不到在改变观察单位时做到这一点的方法。在理想的世界里,我会使用如下代码:

# want something like this but it doesn't work:
newdt <- dt[, .( (new.v.names = sum(.SD, na.rm = TRUE))),
              .SDcols = vars.to.collapse,
              by = 'year']

# not what I want:
newdt
     year V1
1:    1 11
2:    2 11
3:    3 30
4:    4  8

但这并不会产生我在上面向您展示的带有新变量名的数据集。我可以通过使用<code>:=

共有1个答案

贾越
2023-03-14

为了跟进您关于命名新变量的评论,我建议使用< code>data.table库的两个解决方案

因此,请在下面找到两个reprex。

Reprex 1(作为@Roland提出的解决方案的后续行动)

    < li >代码
library(data.table)

vars.to.collapse <- c('v1', 'v2') # your code
new.v.names <- paste0('new', vars.to.collapse) # your code

dt <- dt[, lapply(.SD, sum, na.rm = TRUE), .SDcols = vars.to.collapse, by = 'year'] # Roland's code

setnames(dt, c("year", new.v.names))
    < li >输出
dt
#>     year newv1 newv2
#> 1:     1     3     8
#> 2:     2     5     6
#> 3:     3    22     8
#> 4:     4     0     8

雷普雷克斯2

    < li >代码
library(data.table)

vars.to.collapse <- c('v1', 'v2')  # your code
new.v.names <- paste0('new', vars.to.collapse) # your code

dt[, lapply(.SD, sum, na.rm = TRUE), .SDcols = vars.to.collapse, by = 'year'
   ][, (new.v.names) := .SD, .SDcols = vars.to.collapse
     ][, .SD, .SDcols = !patterns("^v")][]
    < li >输出
#>    year newv1 newv2
#> 1:    1     3     8
#> 2:    2     5     6
#> 3:    3    22     8
#> 4:    4     0     8

< sup >由reprex包(2.0.1版)于2021-11-17创建

 类似资料:
  • 问题内容: doIt函数将打印“ dad”。有没有办法让它打印“儿子”? 问题答案: 是。但是就变量而言,它会被覆盖(将新值赋予变量。将新定义赋予函数是Override)。 在父类的块中使用时,该值将得到反映 如果变量是静态的,则在初始化时使用静态块更改其值, 否则更改构造函数。 你还可以稍后在任何块中更改该值。它将反映在超一流

  • 问题内容: 嗨,我想使用WMI类来查找应用程序和产品信息。但是问题是我想使用Java或任何脚本语言(如python,javascript或perl)。我听说过JWMI,这可能是一个选择。有人可以帮我吗??? 问题答案: JavaScript和Java不是一回事。 JavaScript Windows脚本宿主(WSH)下提供了JavaScript。有了它,访问WMI相当容易: jWMI(Java)

  • 问题内容: 这样,我可以有一个说出what_way_you_do_this = something的函数。这可能吗?基本上,我可以通过给函数提供一个包含变量名称的字符串来告诉函数要设置哪个变量。 谢谢 问题答案: 鉴于: 您可以通过以下方式访问值: 如果要查找全局变量,则应检查其容器();

  • 我在Java写了一个游戏。我做了一个叫做Camera的类,女巫有两个静态的int表示相机的位置。摄像机的位置要求每一帧在许多不同的地方。这个位置有时也会在几个不同的地方被修改。我的问题是,我是否能够以一种使依赖的类独立和更可重用的方式分离camera类。我看过一些东西,包括监听器,但我不确定这些东西是否是用于连续数据传输的。我真的很感激你给我一点建议。 编辑: 同样值得一提的是,我使用的是组件系统

  • 我的问题最好用代码的形式来解释。 然后,我希望它警告x1的值,在本例中x1是“something”。正如您所看到的,这显然是行不通的,但是如何在JavaScript中做到这一点呢?如果你能让你的答案越简单越好,因为我是编程新手。 编辑: 我只是想在这里澄清一下,上面的代码实际上不是我的项目。我只是想用一种简单的方式来解释我的问题,这样大家就能理解我了。我将在下面给出一个实际项目代码的示例。 我知道