如何从函数参数定义 R data.table/data.frame 列?
How could I define an R data.table/data.frame column from a function parameter?
我在 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")
编辑:我认为这个问题应该得到澄清:
这是一个data.table:
> 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
我的 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
我在 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")
编辑:我认为这个问题应该得到澄清:
这是一个data.table:
> 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
我的 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