2014-04-01 143 views
0

我想通过一些对象循环来执行一些子集在每个对象中的数据框。而且,在每年的数据框内我都会进行子集化。我正在使用带有数据帧名称的字符向量将数据传递到循环中,然后使用assign()将其传回给字符名称。问题在于,循环在分配时不会将任何行返回到数据帧。这里是代码:for循环返回0行数据帧

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.请让我知道,如果一个实际可重复的例子将有助于这一点。我只是认为有人可以通过查看代码来挑选某些东西。

+0

有更好的方法来做到这一点,但作为一个开始,对于子集多年,试试这个'年< - 数据[数据$ year == j,]'j的值是unique(data $ year)',并且不是索引。 – infominer

+0

谢谢,infominer。你介意让我介绍一些更好的方法来做到这一点? – logicForPresident

+1

一个可重复的例子会有所帮助,或许你的一个数据框中的'dput'将'dput(df.one)'的输出粘贴到问题中 – infominer

回答

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) 
}