【问题标题】:For loop returning data frame with 0 rowsFor循环返回0行的数据帧
【发布时间】:2014-04-01 20:52:20
【问题描述】:

我正在尝试遍历多个对象,以对每个对象中包含的数据帧执行一些子集化。此外,在每个数据帧中,我都会在几年内进行子集化。我正在使用带有数据帧名称的字符向量将数据传递到循环中,然后使用 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)
}           

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

比例

附:请让我知道一个实际的可重现示例是否对此有所帮助。我只是认为有人可以通过查看代码来挑选出一些东西。

【问题讨论】:

  • 有更好的方法可以做到这一点,但作为开始,按年分组,试试这个yr &lt;- data[data$year == j,] j 的值为unique(data$year) 并且不是索引。
  • 谢谢,infominer。你介意让我介绍一些更好的方法吗?
  • 一个可重现的例子会有所帮助,也许你的一个数据框 dputdput(df.one) 的输出粘贴到问题中

标签: r


【解决方案1】:

评论太长了。

首先,在您的内部循环中,您将 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 &lt;= sampling.date 的行,所以为什么不直接使用:

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

【讨论】:

    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 2021-04-22
    • 2021-12-03
    • 1970-01-01
    • 2023-02-07
    • 2021-09-26
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多