我有这两个数据帧:
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