0

我有一个数据框,它为不同国家/地区提供事件的开始和结束日期。每个国家(例如 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”;每个国家;第二个数据帧已经存在,这意味着我不想转换第一个数据帧,而是将第一个数据帧的信息匹配(?)到第二个数据帧。

我试过

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
4

2 回答 2

1

这是一个使用滚动连接功能的解决方案data.table。我稍微更改(修复了?)您的定义a并删除Eventb1.

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是您想要的格式的数据。data.frame如果您不想将其保留在该类中,则可以像 a 一样使用它或将其转换回来。加入应该非常快。

于 2014-04-25T12:34:33.537 回答
0

您可以通过以下方式生成所有年份的列表

yrs <- mapply(seq, a[[1]], a[[2]])

以及相应国家的名单

ctr <- rep(a[[3]], times=sapply(yrs, length) )

然后设置 b1 中的值

b1$Event[match(sprintf("%s-%s", unlist(yrs), ctr), sprintf("%s-%s", b1$year, b1$Country))] <- 1

它正在创建一个复合年:国家索引,并且对于与事件匹配的每个 b1,其设置为 1。如果在给定年份每个国家/地区有多个事件,它们将被设置为 1。(另外你有不同的'year' 的大写,所以要小心)。

于 2014-04-25T12:25:26.193 回答