我有一个名为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值?
答案 0 :(得分:1)
您可以使用merge()
,而只考虑NA
中没有FLR
的案例。此外,首先将Test1
与FLR
合并,然后您可以删除Circuit_ID
中NA
的任何重复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的原始答案!