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 "macro variables"(是的,我知道,这只是 SAS 的东西,抱歉)。一个 "macro variable" 表示火车站,一个表示方向。在上面的示例中,火车站是 FLI,方向是 in。下面同样的 4 条线路演示了火车站 FBE,这次是 out-going 方向。

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 列表的组合,但我无法让它工作。很可能我都弄错了。如果这个问题(太)愚蠢,我提前道歉,但是非常感谢您对此事的任何帮助。

请问。请注意,我最终想要创建 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)

谢谢, 拉斯

有了你的例子,你想要什么就更清楚了,我再试一次。我使用 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 中解决此问题的方式。