用于循环返回0行的数据帧

时间:2014-04-01 20:52:21

标签: r

我试图循环遍历许多对象,对每个对象中的数据帧执行一些子集化。此外,在每个数据框内,我在几年内进行了子集化。我使用带有数据帧名称的字符向量将数据传递到循环中,然后使用assign()将其传递回字符名称。问题是循环在分配时不会将任何行返回到数据帧。这是代码:

dfs <- c('df.one', 'df.two', 'df.three', etc.)
year <- NULL;
for (i in 1:length(dfs)) {
    data <- get(dfs[i]);
    for (j in unique(data$year)) {
        yr <- data[data$year==unique(data$year)[j],] 
        yr <- subset(yr, snowmelt.date <= sampling.date)
        year <- rbind(year, yr)
    }
    assign(dfs[i], year)
}           

对于其他方法的任何想法或想法将不胜感激!谢谢你的帮助。

P.S。如果一个实际可重复的例子对此有帮助,请告诉我。我只是觉得有人可以通过查看代码来挑选一些东西。

1 个答案:

答案 0 :(得分:0)

评论太长了。

首先,在你的内部循环中,你将j设置为年代序列:

for (j in unique(data$year)) ...

然后在循环的第一行中使用j作为索引(行号...):

yr <- data[data$year==unique(data$year)[j],] 

因此,如果年份是2012年,那么您正试图找到2012年的独特年份向量。可能没有2012行,所以条件失败并且结果中没有行。试试这个:

yr <- data[data$year==j,] 

其次,我没有看到内循环的重点。看起来snowmelt.datesampling.datedata的列。您似乎希望所有年份的行都在snowmelt.date <= sampling.date,所以为什么不使用:

for (i in 1:length(dfs)) {
    data <- get(dfs[i]);
    year <- data[data$snowmelt.date <= data$sampling$date,]
    assign(dfs[i], year)
}