我有一个大型数据框,其中包含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)
同样令人失望的结果。我错过了什么?
答案 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),]
}