【发布时间】:2020-07-07 23:54:51
【问题描述】:
我的数据框遵循以下结构。有一列 A 具有相关的列 A_1、A_2、A_3、A_4,对于 B 也是如此。
# create dummy data frame
dummy_df=data.frame('ID'=c(1,2,3,4),'A'=c('false','false','true','false'),'A_1'=c('false','false','true','false'),'A_2'=c('true','false','false','false'),
'A_3'=c('false','false','true','false'),'A_4'=c('false','false','false','false'),'B'=c('false','true','false','false'),'B_1'=c('false','false','false','false'),'B_2'=c('false','true','false','false'),
'B_3'=c('false','false','true','false'),'B_4'=c('false','false','false','false') )
我打算做的检查如下:
1) 如果 A 为 = false ,是否有任何行,任何子标题 (A_1,A_2,A_3,A_4 ) 为真,例如下面的 ID 1 (A =false, A_2=true)。为此我在网上研究后得出以下代码
dummy_df %>% select(matches('ID|A|A_')) %>% filter(A=='false') %>% filter_all(any_vars(. == 'true'))
必须在整个数据框中使用 A 和子列、B 及其子列等进行相同的检查。我无法将上述内容概括为一个函数,我可以只输入我想要检查的基列(即 A 或 B) 并将其应用到基列 (A 或 B) 的列表上,返回 df_A_mistmatch 、 df_B_mismatch(例如行 ID 3) 作为 lapply 函数的输出以及它们在框架中的 ID。
2) 有助于检查上述内容的其他输出是包含所有子列的交叉表,即获取 A=false 和 A_1 或 A_2 或 A_3 或 A_4 = true 的计数>1
在浏览了很多链接后,我发现 filter_at 除了Any_vars 或 all_vars 之外不允许任何其他条件,并且不允许多个条件,例如在这种情况下 - A=false 和 A_1 或 A_2 或 A_3 或A_4 = 真。因此我在下面使用了两个过滤器。
上述问题的最优解是什么
【问题讨论】: