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$FLIin
和 dataGL$FBEout
。 $
而不是 _
的原因是我实际上并没有为每个数据框创建一个单独的变量。相反,我创建了一个列表,其中列表的每个元素都是数据框之一。这样做的好处是以后对所有数据帧做一些事情会更容易。使用您的解决方案,您必须键入所有各种变量名称,但如果数据框在列表中,您可以使用 lapply
.
等函数来处理它们
如果您希望有许多不同的变量,您可以执行以下操作
for (i in seq_along(stations)) {
assign(paste0("dataGL_",stations[i],directions[i]), dataGLfun(stations[i],directions[i]))
}
但是,在我看来,这不是您在 R 中解决此问题的方式。
我是 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$FLIin
和 dataGL$FBEout
。 $
而不是 _
的原因是我实际上并没有为每个数据框创建一个单独的变量。相反,我创建了一个列表,其中列表的每个元素都是数据框之一。这样做的好处是以后对所有数据帧做一些事情会更容易。使用您的解决方案,您必须键入所有各种变量名称,但如果数据框在列表中,您可以使用 lapply
.
如果您希望有许多不同的变量,您可以执行以下操作
for (i in seq_along(stations)) {
assign(paste0("dataGL_",stations[i],directions[i]), dataGLfun(stations[i],directions[i]))
}
但是,在我看来,这不是您在 R 中解决此问题的方式。