我有一个数据框,其中提供了不同国家/地区的活动开始和结束日期。每个国家(例如,国家A)的事件可能会发生多次。
Start.Year <- c("1990","1992","1997","1995")
End.Year <- c("1995","1993","2000","1996")
Country <- c("A","B","A","C")
a <- data.frame(Start.Year,End.Year,Country)
a$Start.Year <- as.numeric(as.character(a$Start.Year))
a$End.Year <- as.numeric(as.character(a$End.Year))
Start.Year End.Year Country
1990 1995 A
1992 1993 B
1997 2000 A
1995 1996 C
我有第二个数据帧,该数据帧的时间序列横截面格式为(年/国家/事件(是/否)。
b1 <-as.data.frame(expand.grid(year=(1990:2000), Country=unique(a$Country)))
b1$Event <-0
b1$year <- as.numeric(as.character(b1$year))
如何获得以下结果(对于笨拙的演示文稿,我们深表歉意)。当年份介于第一个数据框的开始和结束年之间时,事件应为“ 1”;否则,事件应为“ 1”。对于每个国家 第二个数据帧已经存在,这意味着我不想转换第一个数据帧,而是将信息从第一个数据帧匹配到第二个数据帧。
我试过了
b1$Event[a$Start.Year<=b1$year & a$End.Year>=b1$year] <- 1
但出现“较长的对象长度不是较短的对象长度的倍数”作为错误消息。感谢您的任何提示/建议!
结果旨在:
Year Country Event
1990 A 1
1991 A 1
1992 A 1
1993 A 1
1994 A 1
1995 A 1
1996 A 0
1997 A 1
1998 A 1
1999 A 1
2000 A 1
1990 B 0
1991 B 0
1992 B 1
1993 B 1
1994 B 0
1995 B 0
1996 B 0
1997 B 0
1998 B 0
1999 B 0
2000 B 0
1990 C 0
1991 C 0
1992 C 0
1993 C 0
1994 C 0
1995 C 1
1996 C 1
1997 C 0
1998 C 0
1999 C 0
2000 C 0
这是使用中的滚动联接功能的解决方案data.table
。我对您的定义进行了少许更改(固定?),a
并删除了中的Event
列b1
。
require(data.table)
Start.Year <- c(1990, 1992, 1997, 1995)
End.Year <- c(1995, 1993, 2000, 1996)
Country <- c("A", "B", "A", "C")
a <- data.frame(Start.Year, End.Year, Country)
a <- data.table(a) ## convert to use feature
b1 <-as.data.frame(expand.grid(year=(1990:2000), Country=unique(a$Country)))
b1 <- data.table(b1) ## convert
## join by Start.Year, setting matching keys for each dataset
setkey(a, Country, Start.Year)
setkey(b1, Country, year)
# the tricky part
# roll=TRUE means all years will match to
# next smallest event Start.Year
ab <- a[b1, roll=TRUE]
setnames(ab, c('Country', 'Year', 'Event')) ## fix names
ab[Year > Event, Event:=NA] ## stop index at end year
ab[!is.na(Event), Event:=1] ## transform year markers to 1
ab[is.na(Event), Event:=0] ## transform missing matches to 0
ab
是所需格式的数据。您可以像使用a一样使用它,也可以将其data.frame
转换回该类中。加入应该非常快。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句