我正在尋找的是以下解決方法/工作流程的“最佳實踐批準”替代方案??紤]到我有一堆相似數據的列,并想對這些列或它們的集合執行一系列相似的操作,其中這些操作的復雜度非常高,并且將列名的組傳遞給指定的每個操作在一個變量中。我意識到這個問題聽上去是人為的,但是我以驚人的頻率碰到它。這些示例通常都很混亂,以至于很難分離出與此問題相關的功能,但是我最近偶然發現了一個可以很容易地簡化為MWE的功能:library(data.table)library(lubridate)library(zoo)the.table <- data.table(year=1991:1996,var1=floor(runif(6,400,1400)))the.table[,`:=`(var2=var1/floor(runif(6,2,5)), var3=var1/floor(runif(6,2,5)))]# Replicate data across monthsnew.table <- the.table[, list(asofdate=seq(from=ymd((year)*10^4+101), length.out=12, by="1 month")),by=year]# Do a complicated procedure to each variable in some group.var.names <- c("var1","var2","var3")for(varname in var.names) { #As suggested in an answer to Link 3 above #Convert the column name to a 'quote' object quote.convert <- function(x) eval(parse(text=paste0('quote(',x,')'))) #Do this for every column name I'll need varname <- quote.convert(varname) anntot <- quote.convert(paste0(varname,".annual.total")) monthly <- quote.convert(paste0(varname,".monthly")) rolling <- quote.convert(paste0(varname,".rolling")) scaled <- quote.convert(paste0(varname,".scaled")) #Perform the relevant tasks, using eval() #around every variable columnname I may want new.table[,eval(anntot):= the.table[,rep(eval(varname),each=12)]] new.table[,eval(monthly):= the.table[,rep(eval(varname)/12,each=12)]]當然,此處對數據和變量的特定影響無關緊要,因此,請不要著重于此或提出改進建議以實現在此特定情況下所完成的工作。我正在尋找的是一種通用的工作流程策略,該工作流程將任意復雜的data.table操作過程重復應用于列列表或列列表列表,在變量中指定或作為參數傳遞給函數,這里的程序必須以編程方式引用的變量/參數命名的列,并可能包括更新,連接,分組呼叫的data.table特殊對象.I,.SD等等; 但是比上面的一種或其他需要頻繁使用的工具更簡單,更優雅,更短或更易于設計,實施或理解quote-ing和eval-ing。特別要注意的是,由于過程可能相當復雜,并且涉及到反復更新data.table和引用更新后的列,因此標準lapply(.SD,...), ... .SDcols = ...方法通常不是可行的替代方法。據我所知,eval(a.column.name)用替換每個調用DT[[a.column.name]]也不會簡化很多事情,也不能完全正常地data.table工作,因為據我所知,這對其他操作不太有用。
3 回答
aluckdog
TA貢獻1847條經驗 獲得超7個贊
我只是花時間來完成它并了解工作流程。這對我來說并不自然,但我理解這個主意。我不確定的是它是不自然的,僅僅是因為它對我的使用方式是新的/陌生的,data.table還是因為它實際上是曲折的/真正的不自然的。當然,可能沒有自然的方法可以完成我(/我們)試圖做的事情。我希望更多的人可以離開他們的想法。
- 3 回答
- 0 關注
- 1358 瀏覽
添加回答
舉報
0/150
提交
取消
