R 匹配函数与条件

R match function with conditions

我有一个数据帧 (Df1) 需要用第二个数据帧 (Df2) 进行更新。

如果在 Df2 中找到“Bird.ID”,则“Status”列在 Df1 中采用“Alive”状态(通过匹配 ID)

Df1$Status[match(Df2$Bird.ID, Df1$ID)] <- "Alive"

问题是在 Df1 中,“状态”列可以有“死”值(死鸟应该保持死状态)。

我想找到一种方法来修复“死”状态并使用匹配功能,但如果它已经死了,它仍然是死的。换句话说,我想在“Status”不等于“Dead”的所有行上的这个数据框上应用匹配函数(或任何可以完成相同工作的类似函数)。

好吧,如果您分享一个小但可重现的数据示例,会更容易提供帮助。我创建了一个示例数据集来演示解决方案。

先上数据

Df1 <- data.frame(ID = 1:5, 
                  Status = c('Injured', 'Dead', 'Dead', 'Alive', 'Injured'))

Df2 <- data.frame(Bird.ID = c(1, 3, 5))

Df1

#  ID  Status
#1  1 Injured
#2  2    Dead
#3  3    Dead
#4  4   Alive
#5  5 Injured

Df2
#  Bird.ID
#1       1
#2       3
#3       5

解决方案-

Df1$Status[Df1$ID %in% Df2$Bird.ID & Df1$Status != "Dead"] <- 'Alive'
Df1

#  ID Status
#1  1  Alive
#2  2   Dead
#3  3   Dead
#4  4  Alive
#5  5  Alive

使用@rvx:数据帧和Tidyverse()

library(tidyverse)

Df1 <- data.frame(ID = 1:5, 
                  Status = c('Injured', 'Dead', 'Dead', 'Alive', 'Injured'))

Df2 <- data.frame(Bird.ID = c(1, 3, 5))

Df1 <- Df1 %>% 
  mutate(Status = ifelse(ID %in% Df2$Bird.ID & Status != "Dead", "Alive", Status))