Как я могу определить столбец R data.table / data.frame из параметра функции? - PullRequest
0 голосов
/ 29 мая 2018

Я создал функцию в пакете 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   ...

1 Ответ

0 голосов
/ 29 мая 2018

РЕДАКТИРОВАТЬ : Изменен на новый воспроизводимый пример 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
...