繁体   English   中英

使用来自其他 data.frame 列的值填充 data.frame 列,条件为 R

[英]Fill a data.frame column with values from other data.frame column with a condition R

我有这两个data.frames:

  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_status 列没有任何值时,可以用“LC”填充。 我正在尝试使用 sqldf INSERT TO,但它不起作用。 我想有一个简单的 R 解决方案,告诉我它会更优雅。 有人可以帮忙吗? 非常感谢!

在基础 R 中,您可以执行以下操作:

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

Output:

                   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,])

Output:

                   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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM