reu*_*uss 3 r multiple-conditions dataframe
我试着找出这个问题的答案但没有运气.我在R中有两个数据框(df1和df2),除了两列,一个人数字(pnr)和一个药物名称(名称)之外,有两个不同的信息.在df1中行的行,我想检查,如果pnr和name的组合存在于df2中的某处.如果存在这种组合,我想在df1的另一列中显示"是".如果不是"不".
df1
pnr|drug|...|check
---|----|---|-----
1 | 1 |...| no
1 | 2 |...| yes
2 | 2 |...| yes
3 | 2 |...| no
.....
df2
pnr|drug|...|
---|----|---|
1 | 2 |...|
2 | 2 |...|
....
Run Code Online (Sandbox Code Playgroud)
例如,我想检查,如果行组合pnr = 1&drug = 1存在于df2(否),pnr = 1&drug = 2(是)等等,然后在其中放置"是"或"否"检查df1中的列
我for没有运气就试过以下声明.它确实在"检查"列中放置了"是或否",但它没有正确执行
for(index in 1:nrow(df1)){
if((df1[index,]$pnr %in% df2$pnr)&(df1[index,]$name %in% df2$name)){
check_text="yes"}else{check_text="no"}
df1$check=check_text
}
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,我应该使用apply,但我无法弄明白.你们有没有想法,如何解决这个问题?`
真诚的再见
一种方法是使用base R方法.
粘贴列pnr并drug在一起找到类似match的df1
df1$check <- ifelse(is.na(match(paste0(df1$pnr, df1$drug),
paste0(df2$pnr, df2$drug))),"No", "Yes")
# pnr drug check
#1 1 1 No
#2 1 2 Yes
#3 2 2 Yes
#4 3 2 No
Run Code Online (Sandbox Code Playgroud)
小智 5
这是自然的dplyr::left_join:
library(dplyr) # for left_join, transmute
library(tidyr) # for replace_na
df1 <- expand.grid(pnr = 1:3, drug = 1:3)
df2 <- data.frame(pnr = c(1, 3), drug = c(2, 1))
df1 <- df1 %>%
left_join(df2 %>% transmute(pnr, drug, check = 'yes')) %>%
replace_na(list(check = 'no'))
df1
#> pnr drug check
#> 1 1 1 no
#> 2 2 1 no
#> 3 3 1 yes
#> 4 1 2 yes
#> 5 2 2 no
#> 6 3 2 no
#> 7 1 3 no
#> 8 2 3 no
#> 9 3 3 no
Run Code Online (Sandbox Code Playgroud)