R语言中的逻辑分析

R语言中的逻辑分析,r,R,回避这个问题 假设我们有以下数据集: filt = data.table(X1 = c("Gender","Male"), X2 = c('jobFamilyGroup','Finance'), X3 = c('jobFamilyGroup','Software Dev') df = data.table(Gender = c('Male','F','Male','Male','F'), Em

回避这个问题

假设我们有以下数据集:

filt = data.table(X1 = c("Gender","Male"),
                  X2 = c('jobFamilyGroup','Finance'),
                  X3 = c('jobFamilyGroup','Software Dev')
df = data.table(Gender = c('Male','F','Male','Male','F'),
                EmployeeStatus = c('Active','na','Active','Active','na'),
                jobFamilyGroup = c('Finance','Software Dev','HR','Finance','Software Dev'))
我想使用
filt
作为
df
的过滤器
filt
是通过从Shiny获取一个输入并对其进行一点转换来获得上面的数据表来完成的。我的目标是过滤df,这样我们就有了:
所有行都是男性和(软件开发或财务)

目前,我正在将其硬编码为始终为AND,但这对于这种情况并不理想。我的想法是使用多个
if
条件来捕捉这样的情况,但我觉得可以有一种更简单的方法来构建这种逻辑

___________更新______________

一旦我有了一个像
filt
这样的表,我就可以传递如下代码:

 if(!is.null(primary))
      {
      if(ncol(primary)==1){
        d2 = df[get(as.character(primary[1,1]))==as.character(primary[2,1])]

      }
      else if(length(primary)==2){
        d2 = df[get(as.character(primary[1,1]))==as.character(primary[2,1]) &
                  get(as.character(primary[1,2]))==as.character(primary[2,2])]
      }

      else{
        d2 = df[get(as.character(primary[1,1]))==as.character(primary[1,2]) &
                  get(as.character(primary[1,2]))==as.character(primary[2,2]) &
                  get(as.character(primary[1,3]))==as.character(primary[2,3])]
      }
      }
但是,如果一种分组类型有多个输入,则此代码不考虑所需的或逻辑性。这意味着当前代码说给我所有行,其中:
Gender==Male&Job-Family-Group=='Finance'和Job-Family-Group=='Software-Dev'
当它真的应该是
Gender==Male&(Job-Family-Group=='Finance';Job-Family-Group=='Software-Dev')


这是一个简单的示例,意味着还有许多其他列,因此理想情况下,解决方案能够确定何时存在分组的多个输入

鉴于您的问题,如果您对其进行分析,使您的逻辑看起来像:

Gender %in% c("Male") & jobFamilyGroup %in% c('Finance','Software Dev')
通过将具有相同列名的所有筛选器值集中在%中的
%中,可以得到OR,并在列名之间保留and

更新

考虑下面评论中讨论的案例

您的反应式输入一个data.table指定

  • 性别是男性
  • 国家是中国还是美国
  • 员工状态为活动状态
在您提供的示例数据中,没有国家/地区列,因此我添加了一个。我提取要过滤的列和要过滤的值,并
split
按列过滤的值。我将其传递到一个
lappy
,它使用%
中的
%而不是
=
对每一列进行逻辑检查,以便将同一列中的选项视为
而不是
&
。然后我
rbind
将逻辑结果放在一起,并
对列应用
all
,然后根据结果过滤
df

这种方法处理列之间的
&
,以及列内的
。它支持任意数量的要搜索的列,无需使用if/else逻辑

library(data.table)

df = data.table(Gender = c('Male','F','Male','Male','F'),
                EmployeeStatus = c('Active','na','Active','Active','na'),
                jobFamilyGroup = c('Finance','Software Dev','HR','Finance','Software Dev'),
                Country = c('China','China','US','US','China'))
filt = data.table(x1 = c('Gender' , 'Male'),x2 = c('Country' , 'China'),x3 = c('Country','US'), x4 = c('EmployeeStatus','Active'))
column = unlist(filt[1,])
value = unlist(filt[2,])
tofilter = split(value,column)
tokeep = apply(do.call(rbind,lapply(names(tofilter),function(x){
  `[[`(df,x) %in% tofilter[[x]]
})),2,all)
df[tokeep==TRUE]

#>       Gender EmployeeStatus jobFamilyGroup Country
#>    1:   Male         Active        Finance   China
#>    2:   Male         Active             HR      US
#>    3:   Male         Active        Finance      US

您当前的代码在哪里?你到底想解释什么样的情况?这个问题似乎不够具体,无法回答。我将在帖子中添加一些元素。这是一个很好的简单方法,但不确定它是否足够健壮,适合我的解决方案。假设重复分组是另一列,例如
country
。输入会根据用户选择的过滤器进行更改。为什么国家/地区不起作用?还是别的什么?说出
split(unlist(filt[2,])、unlist(filt[1,]))
以列出所有分组的值。那么你的代码也应该是类似的,只是在%
filt
中用
%替换
=
在我闪亮的应用程序中是一个
被动的
元素。让我们假设filt看起来像:
filt=data.table(x1=c('Gender','Male')、x2=c('Country','China')、x3=c('Country','US')、x4=c('Status','Active'))
这是一句谚语“来自中国或美国的活跃男性(与不活跃的男性相比)”我扩展了我的答案@TedMosby,以展示我的解决方案是如何工作的。我在示例数据中添加了一个国家/地区列,并使用了您在此处指定的过滤器。请注意它是如何处理所有三个条件和您指定的逻辑的。哇,您的答案真漂亮!这正是我想做的