使用R为另一个数据框中的值插入缺失数据的值

ste*_*eve 4 r data-manipulation missing-data

所有,

我有一个问题,我担心这个问题可能太行了,但在其他地方寻找它会让我误入歧途.我可能没有使用正确的搜索字词.

我在R中有一个面板数据框(country-year),在给定变量上有一些缺失值.我试图用另一个数据框中另一个向量的值来估算它们.这是我想要做的一个例子.

假设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
Run Code Online (Sandbox Code Playgroud)

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

country      x
  70       9.234
  80       1.523
  90       7.562
Run Code Online (Sandbox Code Playgroud)

我试图找到一种无缝的方法来自动化这个,超出了命令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)
Run Code Online (Sandbox Code Playgroud)

top*_*hef 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)
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因想要覆盖x的所有值看起来很糟糕,那么使用which仅覆盖NAs(具有相同的合并):

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"]
Run Code Online (Sandbox Code Playgroud)


ale*_*han 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
Run Code Online (Sandbox Code Playgroud)