亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在R中的data.table中使用變量的列名完全通用

如何在R中的data.table中使用變量的列名完全通用

長風秋雁 2019-11-07 12:55:06
我正在尋找的是以下解決方法/工作流程的“最佳實踐批準”替代方案??紤]到我有一堆相似數據的列,并想對這些列或它們的集合執行一系列相似的操作,其中這些操作的復雜度非常高,并且將列名的組傳遞給指定的每個操作在一個變量中。我意識到這個問題聽上去是人為的,但是我以驚人的頻率碰到它。這些示例通常都很混亂,以至于很難分離出與此問題相關的功能,但是我最近偶然發現了一個可以很容易地簡化為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還是因為它實際上是曲折的/真正的不自然的。當然,可能沒有自然的方法可以完成我(/我們)試圖做的事情。我希望更多的人可以離開他們的想法。

查看完整回答
反對 回復 2019-11-07
  • 3 回答
  • 0 關注
  • 1358 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號