如何对数据 table 中的数据子集进行数学运算?

How can I do mathematical operations of a subset of data in data table?

正如问题所说,我想修改一个数据子集。

示例:

library(data.table)
v1 <- rep(c(4.5, 3.5, 4.0, 1.0, 4.0, 3.5, 4.5, 4.0, 1.0, 4.0, 
             3.0, 4.5, 4.0, 3.0, 1.5, 1.5, 2.0, 2.0,
             3.5, 4.5, 3.5, 3.5, 4.0, 3.0, 4.0, 4.0, 2.5, 4.5),100)
v2 <- rep(c(4.5, 3.5, 1.5, 1.0, 4.0, 1.5, 4.5, 1.5, 1.0, 4.0, 
            3.0, 1.5, 1.5, 3.0, 1.5, 1.5, 2.0, 2.0,
            3.5, 1.5, 3.5, 3.5, 1.5, 3.0, 4.0, 4.0, 2.5, 4.5),100)

dt <- data.table(v1, v2)

然后我想切出一个子集并对其进行数学运算,但不想更改其余数据。

我正在寻找如下内容:

dT <- dT[v1 <= 5.0 & v1 > 4.4] * 100

对行进行子集化并将所有列乘以一个常数并保存结果:

dt <- dt[v1 <= 5.0 & v1 > 4.4, lapply(.SD, \(x) x * 100)] 

如果您只想修改in-place所选行,您可以:

dt[v1 <= 5.0 & v1 > 4.4, (names(dt)) := lapply(.SD, \(x) x * 100)] 

请在下面找到一种可能的解决方案。

Reprex

  • 代码
library(data.table)

dt[v1 <= 5.0 & v1 > 4.4] <- dt[, .SD[v1 <= 5.0 & v1 > 4.4] * 100]
  • 输出
dt
#>          v1    v2
#>    1: 450.0 450.0
#>    2:   3.5   3.5
#>    3:   4.0   1.5
#>    4:   1.0   1.0
#>    5:   4.0   4.0
#>   ---            
#> 2796:   3.0   3.0
#> 2797:   4.0   4.0
#> 2798:   4.0   4.0
#> 2799:   2.5   2.5
#> 2800: 450.0 450.0

reprex package (v2.0.1)

于 2022-02-20 创建

通过引用更新列的另一种(更有效)解决方案。

Reprex

  • 代码
library(data.table)

ColsToBeModified <- c("v1", "v2")
dt[v1 <= 5.0 & v1 > 4.4, (ColsToBeModified) := lapply(.SD, \(x) x * 100), .SDcols = ColsToBeModified][]
  • 输出
#>          v1    v2
#>    1: 450.0 450.0
#>    2:   3.5   3.5
#>    3:   4.0   1.5
#>    4:   1.0   1.0
#>    5:   4.0   4.0
#>   ---            
#> 2796:   3.0   3.0
#> 2797:   4.0   4.0
#> 2798:   4.0   4.0
#> 2799:   2.5   2.5
#> 2800: 450.0 450.0

reprex package (v2.0.1)

于 2022-02-20 创建