子集数据使用apply和变量列表

时间:2017-11-06 16:28:59

标签: r

这个帖子是我之前关于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))之一,我试图避免。

1 个答案:

答案 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))