如何从函数参数定义R data.table / data.frame列?

时间:2018-05-29 20:13:13

标签: r function dataframe data.table r-package

我在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

我想创建一个函数,使列的新名称成为用户传递它的字符串。

e.g。

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   ...

1 个答案:

答案 0 :(得分:1)

编辑:更改为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后,我的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

,或许有一个更优雅的解决方案可以解决您的问题
data_dir = "/Users/leon/Projects/inpainting/data/"
images = []
files = glob.glob (data_dir + "*.jpg")
for file in files:
    image = cv2.imread(file, 0)
    images.append(image)