r - 如何从函数参数定义 R data.table/data.frame 列?
问题描述
我在一个带有多个参数的 R 包中创建了一个函数。其中一个参数是 R data.table 的列名。
假设我想创建一个包含所有值的列42
。对于 R data.table dt
,我会这样做:
dt[, column_name:=42]
对于 R data.frame,我会这样做:
df$column_name = 42
我希望函数将定义的东西作为参数column_name
。例如,func
由
func(dt, col='hey')
将hey
作为 data.table 列的新名称传递。
这是一个具体的例子
renamer = function(colname, dt){
## do calculations on dt
dt[, colname:= 42]
}
如果我调用函数renamer(colname = 'foo', dt=dt)
,生成的列名仍然是colname
'foo',而不是我传递的值。
新列应该是字符串 'foo'
我怎么能这样做?我也尝试过使用 R data.frame,或者尝试使用
setnames(dt, "oldname", "newname")
编辑:我认为应该澄清这个问题:
这是一个数据表:
> library(data.table)
> DT = data.table(ID = c("b","b","b","a","a","c"), a = 1:6, b = 7:12, c = 13:18)
> DT
ID a b c
1: b 1 7 13
2: b 2 8 14
3: b 3 9 15
4: a 4 10 16
5: a 5 11 17
6: c 6 12 18
我想创建一个函数,使得列的新名称将是用户传递给它的字符串。
例如
colnamer = function(newcolumname, datatable){
## do calculations on dt
## create a column with whatever string is passed via 'newcolumnname'
}
如果用户调用colnamer('foobar', DT)
,我希望结果是
> DT
ID a b c foobar
1: b 1 7 13 ...
2: b 2 8 14 ...
3: b 3 9 15 ...
4: a 4 10 16 ...
5: a 5 11 17 ...
6: c 6 12 18 ...
解决方案
编辑:更改为 OP 的新可重现示例,其中包含两个根据 OP 的问题陈述起作用的建议;
library(data.table)
DT <- data.table(ID = c("b","b","b","a","a","c"),
a = 1:6, b = 7:12, c = 13:18)
colnamer1 <- function(newcolumname, datatable) {
## do calculations on dt
## create a column with whatever string is passed via 'newcolumnname'
set(datatable, j = newcolumname, value = 42)
}
colnamer2 <- function(newcolumname, datatable) {
## do calculations on dt
## create a column with whatever string is passed via 'newcolumnname'
dt[, (newcolumname) := 42]
}
colnamer1("name_me", DT)
colnamer2("name_me_too", DT)
DT
# ID a b c name_me name_me_too
# 1: b 1 7 13 42 42
# 2: b 2 8 14 42 42
# 3: b 3 9 15 42 42
# 4: a 4 10 16 42 42
# 5: a 5 11 17 42 42
# 6: c 6 12 18 42 42
一个可能的data.frame
解决方案?虽然自从采用data.table
my data.frame
-ing 之后就有点生疏了。当涉及到data.frame
.
df <- data.frame(ID = c("b","b","b","a","a","c"),
a = 1:6, b = 7:12, c = 13:18)
df_colnamer <- function(name_me, df) {
new_df <- df
new_df[[name_me]] <- 42
new_df
}
new_df <- df_colnamer("foo", df)
new_df
# ID a b c foo
# 1 b 1 7 13 42
# 2 b 2 8 14 42
# 3 b 3 9 15 42
# 4 a 4 10 16 42
# 5 a 5 11 17 42
# 6 c 6 12 18 42
推荐阅读
- java - Spring 从 POST 重定向到 GET 并让后退按钮返回上一页而不是同一页
- python - 按距离和分数过滤点列表
- javascript - Javascript 解析日期 Contract_End_Date
- android - 在 Kotlin Multiplatform 上复制到剪贴板
- google-cloud-platform - 系统尚未使用 systemd 作为 init system (PID 1) 引导。不能操作。无法连接到总线:主机已关闭
- sql - NoSQL 或 SQL 或其他用于缩放 Excel 电子表格的工具
- node.js - Graphql Mysql - 从 JSON 格式的表中获取行
- excel - VBA Excel 中的索引匹配函数的错误处理
- c# - 如何在带有 LINQ 的子查询中使用 GroupBy()?
- javascript - 如何将分页应用于 json-server 中的子对象?