我有以下两个数据帧:
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
下面是使用一些整洁的功能有两种方式:
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
为缺项),在各行结合在一起。