仅当目标'cell'为NA时才匹配

时间:2013-12-01 16:39:01

标签: r match

我有以下两个data.frames opcat和polity。

opcat <- data.frame(country = rep(LETTERS[1:5]), date.ratification = c(2003,2004,2005,NA,NA),        date.accession = c(NA,NA,NA,2000,2006))

opcat  

polity <- data.frame(year = rep((2000:2007), 7), country = rep(LETTERS[1:7],8), polity.score = sample(10, 56, replace=TRUE))

polity <- polity[order(polity$country, polity$year),]
polity

我想将dateframe polity的polity.score插入到一个国家'批准'(= date.ratified)或'acceeded'(= date.accession)的年份的data.frame opcat中。

批准

opcat$polity.score <- polity$polity.score[match(interaction(opcat$country, opcat$date.ratification), interaction(polity$country, polity$year))]
opcat

  country date.ratification date.accession polity.score
1       A              2003             NA           10
2       B              2004             NA            2
3       C              2005             NA           10
4       D                NA           2000           NA
5       E                NA           2006           NA

用于访问

 opcat$polity.score <- polity$polity.score[match(interaction(opcat$country, opcat$date.accession), interaction(polity$country, polity$year))]
 opcat

  country date.ratification date.accession polity.score
1       A              2003             NA           NA
2       B              2004             NA           NA
3       C              2005             NA           NA
4       D                NA           2000            9
5       E                NA           2006            7

一个国家有批准或加入的日期(不是两者)。由于加入的匹配将填补NA的批准结果,我尝试了以下修改:

 opcat$polity.score[is.na(opcat$date.ratification)] <- polity$polity.score[match(interaction(opcat$country, opcat$date.accession), interaction(polity$country, polity$year))]
 opcat

但这不起作用。我收到错误消息“要替换的项目数不是替换长度的倍数”。如何将分数与同一变量匹配而不覆盖它们?

最终结果应为

  country date.ratification date.accession polity.score
1       A              2003             NA           10
2       B              2004             NA            2
3       C              2005             NA           10
4       D                NA           2000           9
5       E                NA           2006           7

我认为这不应该那么困难。

非常感谢。

1 个答案:

答案 0 :(得分:1)

year添加到opcat,然后执行标准合并:

opcat$year <- with(opcat, ifelse(is.na(date.ratification), date.accession, date.ratification))
merge(opcat,polity)