R:避免在脚本中使用R子集重复代码行

时间:2015-02-13 11:53:11

标签: r loops macros subset

我对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&#34;宏变量&#34; (是的,我知道,这只是一件SAS事,对不起)。一个&#34;宏变量&#34;指示火车站和指示方向的火车站。在上面的示例中,火车站 FLI ,方向 。火车站 FBE 下面显示了相同的4行,这次是在 out - 前进方向。

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站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)

谢谢, 拉斯

1 个答案:

答案 0 :(得分:0)

通过你的例子,它现在更清楚你想要什么,我再试一次。我使用问题中定义的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中解决这个问题。