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)
使用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)
这是一个选项,通常应该工作:
#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)