1

我正在为一件事苦苦挣扎:我有一个 R 数据框,其中包含每个人的个人 ID、进入年份和退出年份。看起来像:

id  Entry  Exit  
1   1988  1990  
2   1986  1987

我需要一个新的数据框,其中间隔(进入,退出)扩展到它包含的年份,即我需要这个:

id Year  
1  1988  
1  1989  
1  1990  
2  1986  
2  1987

我无法创建正确的循环,非常感谢您的帮助。
干杯

4

2 回答 2

2
d <- structure(list(id = c(1, 2), Entry = c(1988, 1986), Exit = c(1990, 
                1987)), .Names = c("id", "Entry", "Exit"), row.names = c(NA, 
                                                                                                                      -2L), class = "data.frame")

years <- apply(d, 1, function(x) seq(x[2], x[3]))
ids <- rep(d[, "id"], lapply(years, length))

res <- cbind(ids, unlist(years))
res

# ids     
#[1,]   1 1988
#[2,]   1 1989
#[3,]   1 1990
#[4,]   2 1986
#[5,]   2 1987
于 2012-09-12T14:36:41.047 回答
1

这里有两个选项:

  1. 在应用样式命令中构建一个 data.frame,然后将小的 dfs 堆叠成一个大的。
  2. 或者使用 apply-style 命令来处理年份扩展并计算之后需要重复多少次 ID。这就是@LucianoSelzer 在他优雅的回应中所做的。

无论哪种方式都可以正常工作。这是前者的一个例子。

dat <- data.frame(id=seq(2),entry=c(88,86),exit=c(90,87))
res <- apply(dat,1,function(x) data.frame(id=x[1],year=seq(x[2],x[3])) )
> res
[[1]]
  id year
1  1   88
2  1   89
3  1   90

[[2]]
  id year
1  2   86
2  2   87

res现在是 data.frames 的列表。然后我们可以组合data.frames:

library(taRifx)
> stack(res)
  id year
1  1   88
2  1   89
3  1   90
4  2   86
5  2   87

或者在基础 R 中:

do.call(rbind,res) id 年份 1 1 88 2 1 89 3 1 90 4 2 86 5 2 87

于 2012-09-12T14:31:34.833 回答