Match函数覆盖R中的所有内容

Match函数覆盖R中的所有内容,r,R,我有一个名为Test1的DF,它看起来是这样的: Circuit_ID Site_County 001 Yorkshire 002 NA 003 London 004 NA 我有一个叫做FLR的DF Circuit_ID Site_County 001 NA 002 Manchester 003 NA 004 Newcastle 我需要做的是填写Test1 DF上的NA值,而不覆盖

我有一个名为Test1的DF,它看起来是这样的:

Circuit_ID Site_County
001        Yorkshire
002        NA
003        London
004        NA
我有一个叫做FLR的DF

Circuit_ID Site_County
001        NA
002        Manchester
003        NA
004        Newcastle
我需要做的是填写Test1 DF上的NA值,而不覆盖已经存在的值,因此我需要Test1 DF的外观如下:

Circuit_ID Site_County
001        Yorkshire
002        Manchester
003        London
004        Newcastle
我编写了以下代码:

for (i in 1:nrow(Test1)) {
if (is.na(Test1$Site_County)) {
    Test1$Site_County = FLR.Cramer.Join[match(Test1$Circuit_ID,
                    FLR.Cramer.Join$Circuit_ID), "Site_County"]
}
else {

  }
}
但是代码所做的是覆盖整个test1df,以获取FLR-DF上的数据。 我想保留Test1 DF的Site_County col上已经存在的数据,并且只使用FLR Site_County DF中的数据填充NA值。

您可以使用
merge()
,而只考虑
FLR
中没有
NA
的情况。此外,通过首先将
Test1
FLR
合并,您可以随后删除其
站点中具有
NA
的任何重复的
电路ID

rough_df <- merge( Test1, 
                   FLR[complete.cases(FLR$Site_County), ], all=TRUE )
rough_df[!duplicated(rough_df$Circuit_ID), ]
#  Circuit_ID Site_County
#1          1   Yorkshire
#2          2  Manchester
#3          3      London
#4          4   Newcastle

rough_df我意识到for循环在这里不起作用,所以经过一个不眠之夜,我设法让它使用一个简单的Ifelse函数:

Test1$Site_County = ifelse(is.na(Test1$Site_County),
FLR[match(Test1$Circuit_Reference,FLR$Circuit_Reference), "Site_County"], 
as.character(Test1$Site_County))

如果我的代码效率低下,请让我知道,这样我可以进一步提高我的技能。谢谢Ken S给你的原始答案

如果我在DF中有更多的列,这有关系吗?我是新手!我假设你想合并所有列,对吗?我对答案进行了一些编辑,以包括您关于这些列的问题。Test1 DF有413个观察结果,合并后我只有360个,而且,它复制了一个名为Company_name的列,当
Test1 DF
在其
Site_County
列中有许多
NA
时,就会出现这种情况。在将两个数据帧合并到一起之前,
Site\u County
列中所有带有
NA
的行都将被丢弃。我重新阅读了您的问题。您应该只排除
df2
(或您问题中的
FLR
)的不完整案例。我来编辑