используя NSE в data.table в R - PullRequest
       30

используя NSE в data.table в R

2 голосов
/ 13 апреля 2020

У меня есть data.table с именем client, который имеет следующие столбцы:

    "location"   "clientID"   "gender"     "age"  "startYear"  "ag1"        "ag2"      

Существует переменная age и две ее факторизованные версии: ag1 и ag2 .

Теперь я хочу сгруппировать свои данные, используя факторизацию ag1:

agegroup <- sym(agegroup)
clientTotal <- client[,.(NOinsureds=length(clientID)), by = .(gender, agegroup, startYear)]

, что приводит к ошибке:

Show in New WindowClear OutputExpand/Collapse Output Error in [ .data.table (clientData, , .(NOinsureds = length(clientID)), : column or expression 2 of 'by' or 'keyby' is type symbol. Do not quote column names. Usage: DT[,sum(colC),by=list(colA,month(colB))]

Я предполагаю, что это потому, что NSE. Я немного читал об этом в Интернете, поэтому я включил agegroup <- sym(agegroup), но, похоже, он не работает.

Есть предложения?

Я буду много манипулировать данными, а также буду писать функции, так что, возможно, имейте это в виду при рекомендации решений:)

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

На основании ваших разъяснений в комментариях вы сможете использовать get().

library(data.table)
agegroup <- 'ag1'
clientTotal <- client[,.(NOinsureds=length(clientID)), by = .(gender, age = get(agegroup), startYear)]

Рассмотрите этот пример:

library(data.table)
cars <- data.table(mtcars)
strBy <- "carb"
cars[,.(avg.mpg = mean(mpg)), by = .(gear,Carborator = get(strBy))]
    gear Carborator  avg.mpg
 1:    4          4 19.75000
 2:    4          1 29.10000
 3:    3          1 20.33333
 4:    3          2 17.15000
 5:    3          4 12.62000
 6:    4          2 24.75000
 7:    3          3 16.30000
 8:    5          2 28.20000
 9:    5          4 15.80000
10:    5          6 19.70000
11:    5          8 15.00000
0 голосов
/ 13 апреля 2020

Да, ваша проблема связана с NSE. Вместо использования .() вы можете использовать имена векторов символов в by. Синтаксис

agegroup <- "ag1"
clientTotal <- client[,.(NOinsureds=length(clientID)),
                        by = c("gender", agegroup, "startYear")]

data.table очень хорош в функции, потому что `NSÈ не сложен в применении. Если это может помочь вам, я написал пост на тему NSE в data.table . Вы также можете найти много ресурсов в Интернете.

...