使用其他数据的值填充data.frame列.使用条件R填充data.fframe列



我有这两个数据帧:

df1 = data.frame(
"scientific_name"=c("Anchietea ballardii","Anemia patens","Cololobus argenteus"),
"threat_status"=c("VU","EN","EN")
)
> df1
scientific_name threat_status
1 Anchietea ballardii            VU
2       Anemia patens            EN
3 Cololobus argenteus            EN
> 

df2 = data.frame(
"scientific_name"=c("Anchietea ballardii","Anemia patens","Cololobus argenteus","Coleocephalocereus pluricostatus", "Dyckia bracteata", "Merianthera parvifolia", "Kielmeyera rupestris"),
"threat_status"=c(NA)
)
> df2
scientific_name threat_status
1                Anchietea ballardii            NA
2                      Anemia patens            NA
3                Cololobus argenteus            NA
4   Coleocephalocereus pluricostatus            NA
5                   Dyckia bracteata            NA
6             Merianthera parvifolia            NA
7               Kielmeyera rupestris            NA
>

我需要用对应的df1$threat_status填充df2$threat_status,但是当列df2$threat_statu斯没有任何值时;LC";。我正在尝试使用sqldfINSERT TO,但它不起作用。我想要一个纯R的解决方案,告诉我它会更优雅。有人能帮忙吗?非常感谢!

在基本R中,您可以执行:

df2 = merge(df2[,1,drop=F],df1, by="scientific_name", all.x=T)
df2[is.na(df2$threat_status), 2] <- "LC"

输出:

scientific_name threat_status
1              Anchietea ballardii            VU
2                    Anemia patens            EN
3 Coleocephalocereus pluricostatus            LC
4              Cololobus argenteus            EN
5                 Dyckia bracteata            LC
6             Kielmeyera rupestris            LC
7           Merianthera parvifolia            LC

示例中的另一个选项是简单地将df2中的所有threat_status值设置为"LC",然后将df1行绑定到df2中未出现df1$scientfic_name的行:

df2$threat_status="LC"
rbind(df1,df2[!df2$scientific_name %in% df1$scientific_name,])

输出:

scientific_name threat_status
1              Anchietea ballardii            VU
2                    Anemia patens            EN
3              Cololobus argenteus            EN
4 Coleocephalocereus pluricostatus            LC
5                 Dyckia bracteata            LC
6           Merianthera parvifolia            LC
7             Kielmeyera rupestris            LC

使用sqldf可以

library(sqldf)
sqldf("SELECT df2.scientific_name, 
CASE WHEN df1.threat_status IS NULL THEN 'LC'
ELSE df1.threat_status
END AS threat_status
FROM df2 LEFT JOIN df1 ON df2.scientific_name = df1.scientific_name")

#                    scientific_name threat_status
# 1              Anchietea ballardii            VU
# 2                    Anemia patens            EN
# 3              Cololobus argenteus            EN
# 4 Coleocephalocereus pluricostatus            LC
# 5                 Dyckia bracteata            LC
# 6           Merianthera parvifolia            LC
# 7             Kielmeyera rupestris            LC

相关内容

  • 没有找到相关文章

最新更新