如何对数据 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 创建
正如问题所说,我想修改一个数据子集。
示例:
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 创建