匹配功能覆盖R中的所有内容

时间:2017-11-29 11:38:54

标签: 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        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 {

  }
}

但代码所做的是覆盖FLR DF上数据的整个Test1 DF。 我想保留哪些数据已经存在于Test1 DF的Site_County col上,并且仅使用来自FLR Site_County DF的数据填充NA值?

2 个答案:

答案 0 :(得分:1)

您可以使用merge(),而只考虑NA中没有FLR的案例。此外,首先将Test1FLR合并,然后您可以删除Circuit_IDNA的任何重复Site_County

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

关于索引的附带信息:我使用complete.cases()duplicated()来索引数据帧。两个函数都返回TRUE/FALSE向量,我喜欢用它们来选择&#39;只需要那些我需要的行/列。

答案 1 :(得分:0)

我意识到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的原始答案!