R: Динамическая ссылка и работа с переменными в фрейме данных - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь динамически ссылаться и выполнять операции с вектором во фрейме данных. Я пробовал различные формы eval, parse и так далее, но они либо возвращают строку, которую я предоставляю, либо выдают ошибки. У кого-то есть решение? Как я предлагаю В приведенном ниже псевдокоде, решение, по-видимому, заключается в замене DO_SOMETHING () некоторыми другими функциями.

# Example data
mydat <- data.frame(x = rnorm(10))

# Function to add 5 to specified variable in a data frame
add5 <- function(data, var){
                 var_ref <- paste0("data$", var)
                 out <- DO_SOMETHING(var_ref) + 5
                 return out
        }

add5(mydat,x) // returns a numeric vector value of 5
class(add5(mydat,x)) // numeric

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

С data.table легко удалить имена аргументов без кавычек. Если вы начинаете писать функции с использованием имен переменных, я рекомендую вам использовать data.table (см. сообщение в блоге, которое я написал на эту тему ).

С одной переменной вы будете использовать get чтобы снять кавычки с именем переменной

library(data.table)

data <- data.table(x = rnorm(10))
myvar <- "x"
data[, out := get(myvar) + 5]

data
              x      out
 1: -0.30229987 4.697700
 2:  0.51658585 5.516586
 3:  0.12180432 5.121804
 4:  1.53438805 6.534388
 5:  0.06213513 5.062135
 6:  0.17935070 5.179351
 7:  0.70002065 5.700021
 8:  0.12067590 5.120676
 9: -0.41002931 4.589971
10:  0.45385072 5.453851

Обратите внимание, что мне не нужно переназначать результат, потому что := обновляется по ссылке.

С несколькими переменными вы будете использовать .SD + lapply. Этот синтаксис означает применение чего-либо к Подмножеству данных (.SD). Аргумент .SDcols используется для контроля того, какие столбцы рассматриваются в подмножестве данных.

Это очень общий подход, который работает во многих ситуациях.

data <- data.table(x = rnorm(10), y = rnorm(10))
data[, c('out1','out2') := lapply(.SD, function(x) return(x + 5)), .SDcols = c("x","y")]
data
              x          y     out1     out2
 1:  0.91187875 -0.2010539 5.911879 4.798946
 2: -0.70906903  0.2074829 4.290931 5.207483
 3: -0.52517961  0.2027444 4.474820 5.202744
 4:  0.09967933 -1.2315601 5.099679 3.768440
 5: -0.40392510 -0.1777705 4.596075 4.822229
 6:  0.65891623  0.2394889 5.658916 5.239489
 7:  0.76275090  1.5695957 5.762751 6.569596
 8: -0.52395704 -0.7083462 4.476043 4.291654
 9:  0.52728890 -1.1308284 5.527289 3.869172
10: -1.00418691 -0.5569468 3.995813 4.443053

Я мог бы использовать этот подход с одним столбцом (.SDcols = 'x').

1 голос
/ 19 апреля 2020

Если вы хотите передать имена столбцов без кавычек, вы можете использовать deparse substitute, например:

add5 <- function(data, var){
   out <- data[deparse(substitute(var))] + 5
   return(out)
}

add5(mydat,x)

Используя dplyr и некоторую нестандартную оценку с помощью фигурных фигур можно сделать:

library(dplyr)
library(rlang)

add5 <- function(data, var){
   data %>% mutate(out = {{var}} + 5)
}

add5(mydat, x)
#         x  out
#1   1.1604 6.16
#2   0.7002 5.70
#3   1.5868 6.59
#4   0.5585 5.56
#5  -1.2766 3.72
#6  -0.5733 4.43
#7  -1.2246 3.78
#8  -0.4734 4.53
#9  -0.6204 4.38
#10  0.0421 5.04
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...