根据两列年份

时间:2016-03-01 19:43:59

标签: r reshape reshape2

我想基于两列重新整理数据,例如开始年份和结束年份,就像面板数据一样。通过重塑,我可以基于两个独特的id列融化,但它有点棘手。我想根据差异纵向扩展它,并添加一个名为change的列(第一年表示1,否则为0)。有什么建议吗?

这是df的格式。

A <- c("xyz", "xyz", "x","x","x", "y")
start <- c("2001", "1999", "2001", "2000", "1998", "2001")
end <- c("2002", "2001", "2002", "2001", "2000", "2001")
df<- data.frame(A, start,end)

我想最终数据如下

  A     year   change
 xyz    2001     1
 xyz    2002     0
 xyz    1999     1
 xyz    2000     0
 x      2001     1
 x      2002     0
 x      2000     1
 x      2001     0
 x      1998     1
 x      1999     0
 x      2000     0
 y      2001     1

2 个答案:

答案 0 :(得分:0)

这可以使用“reshape2”包来完成:

library(reshape2)
df <- melt(df, id = "A")

我们现在有一个ID列,一个变量列,指示观察是来自“开始”还是“结束”年,而值列给出了相应于每个“开始”和“结束”相关联的年份每个ID。

您描述的“更改”变量在功能上等同于熔化原始数据框所产生的变量列。我们可以通过将值1分配给“开始”观察值并将值0赋值给“结束”观察值来更明确地复制它。

df$change <- 0
df$change[df$variable == "start"] <- 1

答案 1 :(得分:-1)

怎么样:

### OP's code
A <- c("xyz", "xyz", "x","x","x", "y")
start <- c("2001", "1999", "2001", "2000", "1998", "2001")
end <- c("2002", "2001", "2002", "2001", "2000", "2001")
df<- data.frame(A, start,end)

### cast the variables start and end to integer in df
start<-as.integer(start)
end  <-as.integer(end)
df   <-data.frame(A, start, end, stringsAsFactors=F)

### Build up the required columns
expand_year<-with(df, mapply(seq,start,end))
expand_A <- rep(df$A,sapply(expand_year,length))
change<-sapply(expand_year,function(x){ c(1,rep(0,length(x)-1)) })

### Put all the columns into a data.frame
final<-data.frame(A=expand_A,
              year=unlist(expand_year),
              change=unlist(change))

输出:

> final
     A year change
1  xyz 2001      1
2  xyz 2002      0
3  xyz 1999      1
4  xyz 2000      0
5  xyz 2001      0
6    x 2001      1
7    x 2002      0
8    x 2000      1
9    x 2001      0
10   x 1998      1
11   x 1999      0
12   x 2000      0
13   y 2001      1