我正在为一个使用R data.table语法的研究群体计算最小和最高年龄的年龄。将这两种计算编码为单独的data.table链可以工作。当我将代码转换为函数&将输入和输出列传递给函数时,data.table识别对输出列的引用,但不识别对输入列的引用。我简化了下面的代码,以提供一个示例。有什么建议吗?
强文本###计算最小年龄和最大年龄
library(data.table)
c1 = data.table(
min_age = c(18, 28, 30),
max_age = c(19, 31, 41)
)
head(c1)
```{r}c1min_age < 20,min_age_dec := 1min_age >= 30和min_age < 40,min_age_dec := 3
c1max_age < 20,max_age_dec := 1max_age >= 30和max_age < 40,max_age_dec := 3
头(C1)
```javascript函数(dt,in_c,out_c) {
dtin_c < 20,(out_c) := 1in_c >= 30和in_c < 40,(out_c) := 3
}
C1,"min_age",“min_age_dec”
C1,"max_age",“max_age_dec”
头(C1)
在这里输入图像描述
发布于 2022-06-28 21:07:29
对于开发版本的data.table (v1.14.3),您可以使用env参数,参见基于data.table的编程
data.table::update.dev.pkg()
mmfun <- function(dt, in_c, out_c) {
dt[in_c < 20, (out_c) := 1,env=list(in_c=in_c)][
in_c >= 20 & in_c < 30, (out_c) := 2,env=list(in_c=in_c)][
in_c >= 30 & in_c < 40, (out_c) := 3,env=list(in_c=in_c)][
in_c >= 40, (out_c) := 4,env=list(in_c=in_c)]
}
mmfun(c1, "min_age", "min_age_dec")
mmfun(c1, "max_age", "max_age_dec")
head(c1)
min_age max_age min_age_dec max_age_dec
1: 18 19 1 1
2: 28 31 2 3
3: 30 41 3 4为了简化代码,可以使用fcase
mmfun <- function(dt, in_c, out_c) {
dt[, (out_c) := fcase(in_c<20,1,in_c<30,2,in_c<40,3,in_c>=40,4)
, env = list(in_c=in_c)]
}发布于 2022-06-29 06:22:51
下面是使用内置函数findInterval和data.table包解决问题的一种可能方法。注意,我向参数out_c添加了一个默认值(如果输出列名是通过将_dec附加到输入列名的话)。
mmfun <- function(dt, in_c, out_c = paste0(in_c, "_dec")) {
dt[, (out_c) := lapply(.SD, findInterval, c(0, 20, 30, 40)), .SDcols=in_c]
}
mmfun(c1, c("min_age", "max_age"))
# min_age max_age min_age_dec max_age_dec
# 1: 18 19 1 1
# 2: 28 31 2 3
# 3: 30 41 3 4在阈值向量c(0, 20, 30, 40)中,我使用0,因为任何年龄值都不能低于0,而且主要是为了允许间隔计数从1开始(而不是在0)。如果计划对可能具有负值的变量使用此函数,则将0替换为-Inf。
https://stackoverflow.com/questions/72793068
复制相似问题