我有以下两个数据帧:
df1 <- data.frame(ID = c('hds23','has21','her10','hds21','hss23','has23'))
df2 <- data.frame(ID = c('hds23','her10','hds21'))
我想做的是将df2
中df1
上的所有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
答案 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
用于缺少项)在行中绑定在一起。