Match函数覆盖R中的所有内容
我有一个名为Test1的DF,它看起来是这样的: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值,而不覆盖
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
)的不完整案例。我来编辑