基于创建变量,如果两个数据帧的值相等

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

我有以下两个数据帧:

df1 <- data.frame(ID = c('hds23','has21','her10','hds21','hss23','has23'))

df2 <- data.frame(ID = c('hds23','her10','hds21'))

我想这样做的是都在df2是在df1在一个新的变量被标记在df1$Status为“TA”和所有其他的“的NoTA”的ID

我试过ifelse()但它提供了以下错误:

Warning message:
In LACoursesTable1$YearCourseSec == CourseTable$YearCourseSec :
longer object length is not a multiple of shorter object length

这是我想什么df1样子

ID       Status
hds23    TA
has21    NTA
her10    TA
hds21    TA
hss23    NTA
has23    NTA
r
1个回答
1
投票

下面是使用一些整洁的功能有两种方式:

library(tidyverse)

df1 <- data.frame(
  ID = c('hds23','has21','her10','hds21','hss23','has23')
)

df2 <- data.frame(
  ID = c('hds23','her10','hds21')
)


df1 <- df1 %>%
  mutate(
    Status = if_else(
      ID %in% df2$ID,
      'TA',
      'noTA'
    )
  )

df1 <- df1 %>% 
  semi_join(df2, by = 'ID') %>%
  mutate(Status = 'TA') %>% 
  bind_rows(
    df1 %>% 
      anti_join(df2, by = 'ID') %>% 
      mutate(Status = 'noTA')
  )

> df1
     ID Status
1 hds23     TA
2 her10     TA
3 hds21     TA
4 has21   noTA
5 hss23   noTA
6 has23   noTA
> 

第一种方法采用的是有条件的if_else(<cond>, <true>, <false>)而第二使用两个单独的连接(semi_join匹配项和anti_join为缺项),在各行结合在一起。

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