使用上次或先前的观察R填充缺失值

时间:2018-02-16 11:25:57

标签: r

假设我有下表:

ID Name Country
1  A    Nor
2  B    Nor
3  C    Nor
4  D    Nor

我有另一张桌子:

ID Name Country
1  A    
2       Bel
3       Bel
4       Bel

我想得到的结果是:

ID Name Country
1  A    Nor
2  B    Bel
3  C    Bel
4  D    Bel

基本上我想创建一个第三个表,它将优先考虑第二个表,但是会根据ID用第二个表填充缺少的字段。如何在基地R中做任何帮助将非常感激。

3 个答案:

答案 0 :(得分:2)

您可以使用NA获取表示is.na(df2)值的位置的逻辑向量。

然后,您可以将NA的{​​{1}}元素设置为df2中的相应元素。

df

答案 1 :(得分:0)

您可以尝试tidyverse解决方案

library(tidyverse)
d1 %>% 
  left_join(d2, by="ID") %>% 
  mutate(Country=case_when(
    is.na(Country.y) ~ as.character(Country.x),
    is.na(Name.y) ~ as.character(Country.y)
  )) %>% 
  select(ID, Name=Name.x, Country)
  ID Name Country
1  1    A     Nor
2  2    B     Bel
3  3    C     Bel
4  4    D     Bel

case_when部分可轻松自由扩展。

数据

d1 <- read.table(text="ID Name Country
1  A    Nor
2  B    Nor
3  C    Nor
4  D    Nor", header=T)
d2 <- read.table(text="ID Name Country
1  A    NA
2 NA    Bel
3 NA    Bel
4 NA    Bel", header=T)

答案 2 :(得分:0)

假设订单严格相同,并且df1和df2具有相同的大小,并且df1已定义所有名称(如果不是,则需要通过left_join)。好吧,它不是基础R,但dplyr是必须的;)

asyncHookTimeout

基本上将df1作为基线(以便保留Names列,并将列Country替换为df2的值,除非有NA。 (如果你已经调用了dplyr,那么删除dplyr ::)。

用df1

df3 <- dplyr::mutate(df1, Country = ifelse(is.na(df2$Country), Country, df2$Country))

和df2

ID Name Country
1  A    
2       Bel
3       Bel
4       Bel

ps:我投票给@Paul基本解决方案......非常整洁。