首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R data.table不识别对作为函数调用传递的输入列的引用。

R data.table不识别对作为函数调用传递的输入列的引用。
EN

Stack Overflow用户
提问于 2022-06-28 20:58:05
回答 2查看 69关注 0票数 0

我正在为一个使用R data.table语法的研究群体计算最小和最高年龄的年龄。将这两种计算编码为单独的data.table链可以工作。当我将代码转换为函数&将输入和输出列传递给函数时,data.table识别对输出列的引用,但不识别对输入列的引用。我简化了下面的代码,以提供一个示例。有什么建议吗?

强文本###计算最小年龄和最大年龄

代码语言:javascript
复制
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
复制
```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)

在这里输入图像描述

代码语言:javascript
复制
EN

回答 2

Stack Overflow用户

发布于 2022-06-28 21:07:29

对于开发版本的data.table (v1.14.3),您可以使用env参数,参见基于data.table的编程

代码语言:javascript
复制
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

代码语言:javascript
复制
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)]
}
票数 2
EN

Stack Overflow用户

发布于 2022-06-29 06:22:51

下面是使用内置函数findInterval和data.table包解决问题的一种可能方法。注意,我向参数out_c添加了一个默认值(如果输出列名是通过将_dec附加到输入列名的话)。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72793068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档