根据两个数据帧的值是否相等来创建变量

时间:2019-02-03 20:51:23

标签: r

我有以下两个数据帧:

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

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

我想做的是将df2df1上的所有ID分别在df1$Status中的新变量中标记为“ TA”,所有其他变量标记为“ NoTA” “

我尝试过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

1 个答案:

答案 0 :(得分:1)

有两种使用某些 tidy 功能的方法:

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用于缺少项)在行中绑定在一起。