使用subset()提高代码效率

时间:2014-11-25 18:57:34

标签: r

我有一个大型数据框,其中包含2107377个46变量的观测值。我有一个函数根据一年中的日期对该数据框进行子集化:

subset.function = function(dataset,year,focal.year,day.of.year) {
    subset(dataset, year==focal.year & day.of.year<=ifelse(leap_year(focal.year), 112,111))
}

该数据来自2004 - 2014年。我想从这个数据框创建11个数据帧,每个数据帧包含与焦点年份(焦点年份= 2004年,2005年,2006年等)的前111天(或112年,闰年)相关的所有数据。 )。

我可以通过应用我的子集函数11次,每次将其存储在一个新变量中来实现:

variable1 = subset.function(dataset, year, 2004, day.of.year)
variable2 = subset.function(dataset, year, 2005, day.of.year)
...
variable11 = subset.function(dataset, year, 2011, day.of.year),

但这不是很有趣。我尝试使用for循环以较少的行来执行此操作,但它不起作用:

test = vector("list")
for (i in 1:years) {
  test[[i]] = subset.function(dataset, year, focal.year[i], day.of.year)
}

这将创建一个大型列表,其中列表的每个项目中的元素数量与原始数据框架的数量相同。我也尝试使用apply系列函数:

apply(dataset,  year, focal.year[1:11], day.of.year)

同样令人失望的结果。我错过了什么?

1 个答案:

答案 0 :(得分:1)

感谢@ user20650这个引起我注意的链接。我认为subset是蜜蜂的膝盖,但在某些条件下它有一些非常奇怪的行为。

通过切换for循环来删除对子集的调用,它可以正常工作!

test = vector("list")
for (i in 1:years) {
  test[[i]] = data[data$year == timeframe[i] & data$doy >= ifelse(leap_year(timeframe[i]), 112, 111),]
}