假设我有下表:
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中做任何帮助将非常感激。
答案 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基本解决方案......非常整洁。