【问题标题】:rbind inside nested for loops in RR中嵌套for循环内的rbind
【发布时间】:2020-09-23 13:06:01
【问题描述】:

我需要创建不同的数据帧,用 rbind 在 for 循环中存储不同的数据帧,每个 i 一个。

这里是一个例子:

library(lubridate)

    DATA <- data.frame("ID"=c("01","01","02","02","03","03","03","04","04","04","05","05","05","06","06","06"),"x"=c("2009","2012","2013","2009","2012","2011","2013","2009","2010","2010","2011","2010","2009","2010","2011","2013"),"y"=c("a","a","a","b","c","a","a","c","b","b","c","a","c","a","b","c"))
    one <- c("a","b","c")
    two <- c("2009","2010","2011","2012")
listofdfs <- list()
    
for (i in one) {
  for (j in 1:(length(two)-1)) {
    B <- NULL
    A <- DATA[DATA$x %in% c(two[j],two[j+1]) & DATA$y==i ,]

    # keep the oldest date
      tmp<-as.Date(A$x,"%Y-%m-%d")
      
      if (length(tmp)>0)
      {
        A$tag <- 0
        names(tmp)<-1:nrow(A)
        id_x <- as.numeric(tapply(tmp[year(tmp)>two[j]],A$ID[year(tmp)>two[j]],function(x){
          id <- which.min(x)
          names(x)[id]
        }))
        A$tag[id_x] <- 1
      }
      
      # aggregate datasets over different years
      B <- rbind(B,A)
         }
   listofdfs[[i]] <- B
    }

这几乎是我想要获得的,除了 B 不是不同 A 的聚合(A 每次都被覆盖)。

我得到一个这样的列表:

$a
  ID    x y tag
2 01 2012 a   0
6 03 2011 a   0

$b
   ID    x y tag
15 06 2011 b   0

$c
   ID    x y tag
5  03 2012 c   0
11 05 2011 c   0

由于覆盖(我不想要),2010 不存在。

有什么想法吗?谢谢!

【问题讨论】:

  • 我写的示例代码有错误。现在它正在工作
  • 你能解释一下你想做什么吗?
  • 我在 { } 中只写了一部分代码,所以你可能不明白我的目标。无论如何,我想从 DATA 中提取一个子集(A),首先隔离 2009 年和 2010 年,然后是 2010 年和 2011 年,然后是 2011 年和 2012 年,依此类推。然后我将处理 A(这里我没有报告我的所有代码)并且我将只选择一些 ID。然后我想将所有这些子集 (A) 绑定到 B 中,但我希望每个 i ("a","b","c") 都有一个不同的 B。是不是更清楚了?
  • 重点是在 B 中创建的所有 A 都被覆盖,而在 B 中我只能看到最后创建的 A。为什么会被覆盖?
  • 好的。我相信问题在于你在两个for 循环内都有B &lt;- NULL,但它应该在for (j in 1:(length(two)-1)) 循环之外

标签: r loops rbind


【解决方案1】:

你写的地方

for (i in one) {
  for (j in 1:(length(two)-1)) {
    B <- NULL

应该是

for (i in one) {
  B <- NULL
  for (j in 1:(length(two)-1)) {

有输出

> listofdfs
$a
    ID    x y tag
1   01 2009 a   0
12  05 2010 a   0
14  06 2010 a   0
6   03 2011 a   0
121 05 2010 a   0
141 06 2010 a   0
2   01 2012 a   0
61  03 2011 a   0

$b
    ID    x y tag
4   02 2009 b   0
9   04 2010 b   0
10  04 2010 b   0
91  04 2010 b   0
101 04 2010 b   0
15  06 2011 b   0
151 06 2011 b   0

$c
    ID    x y tag
8   04 2009 c   0
13  05 2009 c   0
11  05 2011 c   0
5   03 2012 c   0
111 05 2011 c   0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2017-04-30
    • 2021-08-09
    • 2021-09-15
    相关资源
    最近更新 更多