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,以展示我的解决方案是如何工作的。我在示例数据中添加了一个国家/地区列,并使用了您在此处指定的过滤器。请注意它是如何处理所有三个条件和您指定的逻辑的。哇,您的答案真漂亮!这正是我想做的