簡體   English   中英

R:避免在腳本中使用R子集重復代碼行

[英]R: Avoid repeating lines of code using R subsets in scripts

我是R的新手 - 但多年來一直在開發SAS程序(和VBA)。 好吧,問題是我有4行R代碼(腳本?),我想重復44次。 22個不同的火車站各有兩次,表明火車是在入境還是在出行。 四行代碼是:

dataGL_FLIin <- subset( dataGL_all, select = c(Tidsinterval, Dag, M.ned, Ugenr.,Kode, Ugedag, FLIin))
names(dataGL_FLIin)[names(dataGL_FLIin)=='FLIin'] <- 'GL_Antal'
dataGL_FLIin$DIR<-"IN"
dataGL_FLIin$STATION<-"FLI    

為了避免重復4行44次,我需要2個“宏變量”(是的,我知道,這只是一個SAS事物,對不起)。 一個“宏變量”指示火車站,一個指示方向。 在火車站上面的例子是FLI其方向是英寸 火車站FBE下面顯示了相同的4條線,這次是在向外的方向。

dataGL_FBEout <- subset( dataGL_all, select = c(Tidsinterval, Dag, M.ned, Ugenr.,Kode, Ugedag, FBEout))
names(dataGL_FBEout)[names(dataGL_FBEout)=='FBEout'] <- 'GL_Antal'
dataGL_FBEout$DIR<-"OUT"
dataGL_FBEout$STATION<-"FBE"

我看了很多地方,並嘗試了許多R功能和R列表的組合,但我不能使它工作。 很可能我弄錯了。 如果問題是(太)愚蠢,我會提前道歉,但是對此問題的任何幫助都會非常感激。

PLS。 請注意,我最終想要創建44個不同的數據幀:1)dataGL_FLIin 2)dataGL_FBEout 3)等...

添加:2 STATION 2方向我的問題示例

'The one data frame I have'
Date<-c("01-01-15 04:00","01-01-15 04:20","01-01-15 04:40")
FLIin<-c(96,39,72)
FLIout<-c(173,147,103)
FBEin<-c(96,116,166)
FBEout<-c(32,53,120)
dataGL_all<-data.frame(Date, FLIin, FLIout, FBEin, FBEout)

'The four data frames I would like'
GL_antal<-c(96,39,72)
Station<-("FLI")
Dir<-("IN")
dataGL_FLIin<-data.frame(Date, Station, Dir, GL_antal)

GL_antal<-c(173,147,103)
Station<-("FLI")
Dir<-("OUT")
dataGL_FLIout<-data.frame(Date, Station, Dir, GL_antal)

GL_antal<-c(96,116,166)
Station<-("FBE")
Dir<-("IN")
dataGL_FBEin<-data.frame(Date, Station, Dir, GL_antal)

GL_antal<-c(32,53,120)
Station<-("FBE")
Dir<-("OUT")
dataGL_FBEout<-data.frame(Date, Station, Dir, GL_antal)

謝謝,Lars

以你的例子,現在你想要的更清楚,我再試一次。 我使用你的問題和定義中定義的dataGL_all

stations <- rep(c("FLI","FBE"),each=2)
directions <- rep(c("in","out"),times=length(stations)/2)

您還可以從數據框中提取工作站和路線。 使用您的示例,以下將起作用

stations <- substr(names(dataGL_all)[-1],1,3)
directions <- substr(names(dataGL_all)[-1],4,6)

然后,我定義將對數據起作用的函數:

dataGLfun <- function(station,direction) {
    name <- paste0(station,direction)
    dataGL <- dataGL_all[,c("Date", name)]
    names(dataGL)[names(dataGL)==name] <- 'GL_Antal'
    dataGL$DIR<-direction
    dataGL$STATION<-station
    dataGL
}

現在我將此功能應用於所有兩個方向的站點:

dataGL <- mapply(dataGLfun,stations,directions,SIMPLIFY=FALSE)
names(dataGL) <- paste0(stations,directions)

現在,您可以獲取每個站點和方向組合的數據幀。 例如,問題中的兩個示例使用dataGL$FLIindataGL$FBEout 之所以有$而不是_是,我實際上並未為每個數據幀創建一個單獨的變量。 相反,我創建了一個列表,其中列表的每個元素都是數據框之一。 這樣做的好處是,以后對所有數據幀執行操作會更容易。 使用您的解決方案,您必須鍵入所有各種變量名稱,但如果數據框位於列表中,您可以使用lapply函數來處理它們。

如果您希望有許多不同的變量,則可以執行以下操作

for (i in seq_along(stations)) {
    assign(paste0("dataGL_",stations[i],directions[i]), dataGLfun(stations[i],directions[i]))
}

但是,在我看來,這不是你應該如何在R中解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM