将两个数据框与条件进行比较

时间:2020-08-18 02:36:02

标签: r dataframe

我有两个数据框:

df1 <- data.frame( v1 = c(1,2,3,4), 
                   v2 = c(2, 10, 5, 11), 
                   v3=c(20, 25, 23, 2))  

> df1
  v1 v2 v3 
1  1  2 20  
2  2 10 35  
3  3  5 23  
4  4 11  2  

df2 <- data.frame(v1 = 4,  = 10, v3 = 30)

> df2
  v1 v2 v3 
1  4 10 30 

我想添加一个新列,当df1大于df2时显示“失败”,而当其较小时则显示“通过”,以使预期结果为:

 > df3
  v1 v2 v3 check
1  1  2 20  Pass
2  2 10 35  Fail
3  3  5 23  Pass
4  4 11  2  Fail

2 个答案:

答案 0 :(得分:3)

您可以使两个数据框的大小相似并直接进行比较:

ifelse(rowSums(df1 >= df2[rep(1,length.out = nrow(df1)), ]) == 0, 'Pass', 'Fail')
#[1] "Pass" "Fail" "Pass" "Fail"

或使用Map

ifelse(Reduce(`|`, Map(`>=`, df1, df2)), 'Fail', 'Pass')
#Other similar alternatives :

#c('Pass', 'Fail')[Reduce(`|`, Map(`>=`, df1[-1], df2[-1])) + 1]
#c('Fail', 'Pass')[(rowSums(mapply(`>=`, df1, df2)) == 0) + 1]

答案 1 :(得分:0)

tidyverse中,我们可以使用c_across

library(dplyr) # >= 1.0.0
df1 %>% 
    rowwise %>%
    mutate(check = c('Pass', 'Fail')[1 + any(c_across(everything()) >= df2)])
# A tibble: 4 x 4
# Rowwise: 
#     v1    v2    v3 check
#  <dbl> <dbl> <dbl> <chr>
#1     1     2    20 Pass 
#2     2    10    25 Fail 
#3     3     5    23 Pass 
#4     4    11     2 Fail