这个帖子是我之前关于apply
函数与多条subet
组合的线程的延续。我需要根据时间范围(以年为单位)对数据进行子集化。我有多个数据框,每个数据框包含不同年份的数据。我需要根据它设置时间范围和子集数据。我认为最好用例子来解释:
set.seed(200)
#example data frames
df_2014=data.frame(colour=(c(rep("RED",10),rep("BLUE",10),rep("GREEN",10)))
,shade=c(rep(c(rep("LIGHT",5),rep("DARK",5)),3))
,year=c(rep(2011:2015,6))
,value=runif(30,min=0,max=1))
df_2013=data.frame(colour=(c(rep("RED",10),rep("BLUE",10),rep("GREEN",10)))
,shade=c(rep(c(rep("LIGHT",5),rep("DARK",5)),3))
,year=c(rep(2011:2015,6))
,value=runif(30,min=0,max=1))
#time horizon, it can be +1,-2, any value. Its always constant
horizon=+1
#subset functions for each df
subset(df_2014, df_2014$colour %in% "BLUE" & df_2014$shade %in% "DARK" & df_2014$year %in% c(2014+horizon))
subset(df_2013, df_2013$colour %in% "BLUE" & df_2013$shade %in% "DARK" & df_2013$year %in% c(2013+horizon))
输出结果为:
colour shade year value
20 BLUE DARK 2015 0.6463296
colour shade year value
19 BLUE DARK 2014 0.6532767
感谢用户Rui Barradas的善意,我有两个版本的apply
功能:
lapply(list.dfs, function(x) customSubset(x, "BLUE", "DARK"))
lapply(list.dfs, customSubset, "BLUE", "DARK")
customSubset
的位置:
customSubset <- function(DF, COL, SHADE){
subset(DF, colour %in% COL & shade %in% SHADE)
}
我需要添加第三个参数,这个参数可能是年份列表(这是我的“变量列表”,比如在线程标题中),指的是每个df(例如我有df来自多年这样:{ {1}})然后将呈现的输出存储为一个数据帧。
我的第一次尝试是创建年份列表list.dfs=list(df_2014,df_2013,df_2012,df_2011)
,我尝试过这样的事情:
list.years=c(2014,2013,2012,2011)
#here i add new variable to customSubset:
customSubsetYEAR <- function(DF, COL, SHADE,year){
subset(DF, colour %in% COL & shade %in% SHADE %in% year)
}
#horizon as in example
horizon=+1
哪个不行。如果不清楚,请告诉我。任何解决方法都没问题,除了#here is adjusted(incorrectly) lapply function:
lapply(list.dfs, function(x) customSubset(x, "BLUE", "DARK",year.list[x]+horizon))
之一,我试图避免。
答案 0 :(得分:2)
试试这个
list.dfs=list(df_2014,df_2013,df_2012,df_2011)
names(list.dfs)<-c(2014,2013,2012,2011) #or put some grep pattern to automate it
功能定义
customSubset <- function(DF, COL, SHADE , YEAR){
subset(DF, colour %in% COL & shade %in% SHADE & year %in% YEAR)
}
码
lapply(names(list.dfs), function(x) customSubset(list.dfs[[x]], "BLUE", "DARK",as.numeric(x)+horizon))