4

全部,

我有一个问题,我担心在这里问可能太普通了,但在别处寻找它会让我误入歧途。我可能没有使用正确的搜索词。

我在 R 中有一个面板数据框(国家年),给定变量有一些缺失值。我试图用另一个数据框中另一个向量的值来估算它们。这是我正在尝试做的一个说明。

假设Data是感兴趣的数据框,它在给定向量上有缺失值,我试图从另一个捐助者数据框进行估算。它看起来像这样。

country    year      x
  70       1920    9.234
  70       1921    9.234
  70       1922    9.234
  70       1923    9.234
  70       1924    9.234
  80       1920      NA
  80       1921      NA
  80       1922      NA
  80       1923      NA
  80       1924      NA
  90       1920    7.562
  90       1921    7.562
  90       1922    7.562
  90       1923    7.562
  90       1924    7.562

这将是Donor框架,其值为country == 80

country      x
  70       9.234
  80       1.523
  90       7.562

我试图找到一种无缝的方式来自动化这个,超越Data$x[Data$country == 80] <- 1.523. 有很多国家在x.

可能值得澄清的是,简单的merge将是最简单的,但不一定适合我正在尝试做的事情。一些国家会x在不同年份看到变化。基本上,我想要完成的是一个命令,如果给定国家/地区的所有年份x都缺少Data的值,则从数据中获取该国家/地区的相应值Donor并将其粘贴到所有国家/地区年份作为“最好的猜测”之类的。

感谢您的任何意见。我怀疑这是一个菜鸟问题,但我不知道搜索它的正确术语。

上述数据的可重现代码如下。

country <- c(70,70,70,70,70,80,80,80,80,80,90,90,90,90,90)
year <- c(1920,1921,1922,1923,1924,1920,1921,1922,1923,1924,1920,1921,1922,1923,1924)
x <- c(9.234,9.234,9.234,9.234,9.234,NA,NA,NA,NA,NA,7.562,7.562,7.562,7.562,7.562)

Data=data.frame(country=country,year=year,x=x)
summary(Data)

country <- c(70,80,90)
x <- c(9.234,1.523,7.562)
Donor=data.frame(country=country,x=x)
summary(Donor)
4

2 回答 2

5

使用merge

r = merge(Data, Donor, by="country", suffixes=c(".Data", ".Donor"))
Data$x = ifelse(is.na(r$x.Data), r$x.Donor, r$x.Data)

如果出于某种原因覆盖 x 的所有值的想法似乎不好,则使用which仅覆盖 NA(具有相同的合并):

r = merge(Data, Donor, by="country", suffixes=c(".Data", ".Donor"))
na.idx = which(is.na(Data$x))
Data[na.idx,"x"] = r[na.idx,"x.Donor"]
于 2013-06-16T03:21:32.150 回答
5

这是一个选项,应该可以正常工作:

#Get the vector of countries with missing x
country.na <- Data$country[is.na(Data$x)]
#Get corresponding location of x in Donor
index <- sapply(country.na, function(x) which(Donor$country == x))
#Replace NA values with corresponding values in Donor
Data$x[is.na(Data$x)] <- Donor$x[index]
Data
#    country year     x
# 1       70 1920 9.234
# 2       70 1921 9.234
# 3       70 1922 9.234
# 4       70 1923 9.234
# 5       70 1924 9.234
# 6       80 1920 1.523
# 7       80 1921 1.523
# 8       80 1922 1.523
# 9       80 1923 1.523
# 10      80 1924 1.523
# 11      90 1920 7.562
# 12      90 1921 7.562
# 13      90 1922 7.562
# 14      90 1923 7.562
# 15      90 1924 7.562
于 2013-06-16T03:21:48.670 回答