dplyr 在新列中返回 NA 并且不遵循条件

问题描述 投票:0回答:1

我有一个关于动物目击事件的数据框(超过 300 个),其中包括鲸鱼、海豚、鳍足类和企鹅等物种。

我想创建一个新列

reino
,其中
misticeto
代表鲸鱼,
odontoceto
代表海豚,
pinipede
代表蜈蚣,
penguin
代表企鹅。

但是当我这样做时,一只特定的鲸鱼(Ballena franca australis (Eubalaena australis))会在

NA
列中产生
reino
值。

library(data.table)
library(dplyr)
> packageVersion("dplyr")
[1] ‘1.1.4’


dt = data.table(especie= c('Ballena franca austral (Eubalaena australis)','Ballena barbada no identificada (Parvorden Mysticeti)', 'Ballena jorobada (Megaptera novaeangliae)', 'Ballena rorcual no identificada (Balaenoptera sp.)', 'Ballena sei (Balaenoptera borealis)', 'Ballena fin (Balaenoptera physalus)', 'Ballena barbada no identificada(Parvorden Mysticeti)','Delfín austral (Lagenorhynchus australis)', 'Delfín no identificado (Familia Delphinidae)', 'Tonina overa (Cephalorhynchus commersonii)', 'Delfín oscuro (Lagenorhynchus obscurus)','Lobo marino de dos pelos no identificado (Arctocephalus sp.)', 'Lobo marino no identificado (Familia Otariidae)', 'Lobo marino de dos pelos sudamericano (Arctocephalus australis)', 'Lobo marino de un pelo sudamericano (Otaria flavescens)', 'Lobo marino de dos pelos antártico (Arctocephalus gazella)','Lobo marino de dos pelos sudamericano (Arctocephalusaustralis)','Pingüino patagónico (Spheniscus magellanicus)', 'Pingüino no identificado (Familia Spheniscidae)', 'Cormorán Imperial (Phalacrocorax albiventer)', 'Pingüino penacho amarillo austral (Eudyptes chrysocome)', 'Pingüino rey (Aptenodytes patagonicus)'))

as.character(dt$especie)

我想做这个:

dt$reino[dt$especie %in% c('Ballena franca austral (Eubalaena australis)','Ballena barbada no identificada (Parvorden Mysticeti)', 'Ballena jorobada (Megaptera novaeangliae)', 'Ballena rorcual no identificada (Balaenoptera sp.)', 'Ballena sei (Balaenoptera borealis)', 'Ballena fin (Balaenoptera physalus)', 'Ballena barbada no identificada(Parvorden Mysticeti)')] <- 'misticeto'

dt$reino[dt$especie %in% c('Delfín austral (Lagenorhynchus australis)', 'Delfín no identificado (Familia Delphinidae)', 'Tonina overa (Cephalorhynchus commersonii)', 'Delfín oscuro (Lagenorhynchus obscurus)')] <- 'odontoceto'

dt$reino[dt$especie %in% c('Lobo marino de dos pelos no identificado (Arctocephalus sp.)', 'Lobo marino no identificado (Familia Otariidae)', 'Lobo marino de dos pelos sudamericano (Arctocephalus australis)', 'Lobo marino de un pelo sudamericano (Otaria flavescens)', 'Lobo marino de dos pelos antártico (Arctocephalus gazella)','Lobo marino de dos pelos sudamericano (Arctocephalusaustralis)')] <- 'pinipede'

dt$reino[dt$especie %in% c('Pingüino patagónico (Spheniscus magellanicus)', 'Pingüino no identificado (Familia Spheniscidae)', 'Cormorán Imperial (Phalacrocorax albiventer)', 'Pingüino penacho amarillo austral (Eudyptes chrysocome)', 'Pingüino rey (Aptenodytes patagonicus)')] <- 'penguin'

当我第一次运行代码时出现此警告:

Warning message: Unknown or uninitialised column: reino. 

然后,我继续运行代码,新列

reino
NA
值仅适用于 Ballena franca austral (Eubalaena australis)。

我尝试做这些事情,但没有成功:

dt %>% left_join(data.frame(especie = c('Ballena franca austral (Eubalaena australis)', reino = c('misticeto'))))

and

mutate(reino = case_match(especie, 'Ballena franca austral (Eubalaena australis)' ~ 'misticeto'))

第二个问题是:

  • 我注意到一只海豚和一只企鹅达到了
    misticeto
    (鲸鱼)状态。
misticeto<-filter(dt, reino == "misticeto");misticeto

> table(misticeto$especie)

Ballena barbada no identificada (Parvorden Mysticeti)  Ballena barbada no identificada(Parvorden Mysticeti) 
                                                   23                                                     1 
                  Ballena fin (Balaenoptera physalus)          Ballena franca austral (Eubalaena australis) 
                                                    4                                                    33 
            Ballena jorobada (Megaptera novaeangliae)    Ballena rorcual no identificada (Balaenoptera sp.) 
                                                   13                                                     9 
                  Ballena sei (Balaenoptera borealis)               Delfín oscuro (Lagenorhynchus obscurus) 
                                                    8                                                     1 
               Pingüino rey (Aptenodytes patagonicus) 
                                                    1 

#The Delfín oscuro (Lagenorhynchus obscurus) and Pingüino rey (Aptenodytes patagonicus)  shouldn't be there.
  • 而且,并非所有海豚都会进入
    reino
    列,其中一只失踪了(达到了
    misticeto
    状态)。
odontocetos<-filter(dt, reino == "odontoceto");odontocetos
> table(odontocetos$especie)

   Delfín austral (Lagenorhynchus australis) Delfín no identificado (Familia Delphinidae) 
                                          25                                           12 
  Tonina overa (Cephalorhynchus commersonii) 
                                           8 

#The dolphin that came to misticeto condition is missing here, 'Delfín oscuro (Lagenorhynchus obscurus)'

有人可以帮助我吗?我不明白发生了什么。

谢谢!

r dplyr conditional-statements conditional-formatting conditional-operator
1个回答
0
投票

您收到第一个警告的原因是因为您将值分配给不存在的列(

reino
)。由于您使用的是
dplyr
,执行此操作的一种方法是使用
case_when
/
case_match

library(dplyr)

dt <- dt %>%
  mutate(reino = case_when(especie %in% c('Ballena franca austral (Eubalaena australis)','Ballena barbada.....') ~ 'misticeto', 
                           especie %in% c('Delfín austral (Lagenorhynchus australis)', 'Delfín no...') ~ 'odontoceto',
                           ......
                           ))

dt

我已经用

...
标记了长文本,您可以填写您的数据。您需要确保这些单词与数据中的单词完全匹配。如果你想使用
data.table
,它有一个名为
fcase
的函数,其行为方式相同。

© www.soinside.com 2019 - 2024. All rights reserved.