【发布时间】: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 <- NULL,但它应该在for (j in 1:(length(two)-1))循环之外