我的資料如下:
library(data.table)
set.seed(1)
year = c(rep(2000,5), rep(2001,5), rep(2002,5), rep(2003,5), rep(2004,5))
DT <- data.table(panelID = sample(10,10),
some_type = as.factor(sample(0:5, 6)),
some_other_type = as.factor(sample(0:5, 6)),
Group = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)),
wt = 15*round(runif(100)/10,2),
Income = round(rnorm(10,-5,5),2),
Income_proxy = round(rnorm(10,-6,6),2),
year = rep(year,4),
Happiness = sample(10,10),
Sex = round(rnorm(10,0.75,0.3),2),
Age = sample(100,100),
Height= 150*round(rnorm(10,0.75,0.3),2))
我正在嘗試撰寫一個僅通過提供分組變數來自動創建某些計算的函式。
calulate_relative_dev <- function(DT, varA="Income", varB="Income_proxy", groups, years=NULL) {
if (is.null(years)) {
out_names <- paste0("rel_deviation_", groups[i])
for (i in seq_along(groups)) {
setDT(DT)[, (out_names[i]) := 100*mean((varA - varB) / varA), by=eval(groups[i])]
}
} else if (!is.null(years))
out_names <- paste0("rel_deviation_", groups[i], years[i])
for (i in seq_along(groups)) {
for (j in seq_along(years)) {
setDT(DT)[, (out_names[i]) := 100*mean((varA - varB) / varA), by=eval(groups[i], years[i])]
}
}
}
為了做到:
calulate_relative_dev(DT, groups = c("Group","some_type"))
和
calulate_relative_dev(DT, groups = c("Group","some_type"), years=year))
但是當我這樣做時,我收到以下錯誤:
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function 'mean': object 'Income' not found
Called from: h(simpleError(msg, call))
如果我嘗試加上Income
引號,我會得到:
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function 'mean': non-numeric argument to binary operator
Called from: h(simpleError(msg, call))
我應該如何在這里寫語法?
uj5u.com熱心網友回復:
根據您對我的問題的評論/回復,我理解years
這是合乎邏輯的。這是一種可能的功能:
calulate_relative_dev <- function(DT, varA="Income", varB="Income_proxy", groups, year=FALSE) {
dt <- copy(DT)
setnames(dt, old = c(varA, varB), new = c("varA", "varB"))
for (i in seq_along(groups)) {
out_names <- paste0("rel_deviation_", groups)
if(year) out_names <- paste0(out_names, "_by_year")
dt[, c(out_names[i]) := 100*mean((varA - varB) / varA), by=c(groups[i], if(year){"year"})]
}
setnames(dt, old = c("varA", "varB"), new = c(varA, varB))
return(dt[])
}
calulate_relative_dev(DT, groups = c("Group","some_type"))
calulate_relative_dev(DT, groups = c("Group","some_type"), year=TRUE)
我做了臨時重命名以使data.table
代碼更易于讀/寫。回傳dt[]
確保在data.table
評估函式后列印。
uj5u.com熱心網友回復:
這是此功能的一種稍微簡單的方法:
calculate_relative_dev <- function(DT, varA="Income", varB="Income_proxy", groups, year=FALSE) {
for(g in groups) {
vname = paste0(g,"_rel_dev")
if(year) {g=c(g,"year");vname = paste0(vname,"_by_yr")}
DT[, c(vname):=100*mean((get(varA) - get(varB))/get(varA)),g]
}
DT[]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/491079.html
上一篇:將列的值從正值更改為負值