我想基于两列重新整理数据,例如开始年份和结束年份,就像面板数据一样。通过重塑,我可以基于两个独特的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
答案 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