【问题标题】:R filtering logicR过滤逻辑
【发布时间】:2015-03-09 20:19:37
【问题描述】:

需要一些有关如何修复此过滤逻辑的见解。

test.session <- c("A","A","A","B","B","B")
test.start_flag <- c("1","0","0","1","0","0")
test.url <- c("in_list","in_field","out","not_in_list","in_field","out")
test.code_map <- 'tbd'
test.manual_map <- c("1","1","0","0","0","0")
test.df <- data.frame(test.session, test.start_flag, test.url, test.code_map, test.manual_map)

我想生成test.code_map 以匹配test.manual_map 向量。我已经对前四行进行了编码,但是需要对第 5 行和第 6 行的逻辑进行调整。逻辑:

  • 如果起始标志为 1 且 url 为 'in_list',则 code_map 等于 1(完成)
  • 如果起始标志为 0 且 url 为 'in_field',则 code_map 等于 1(完成)
  • 如果起始标志为 0 且 url 为“out”,则 code_map 等于 0(完成)
  • 如果开始标志为 1 且 url 为 'not_in_list' 则代码映射等于 0(完成)
  • 如果起始标志为 0 且 url 为 'out',则代码映射等于 0(完成 - 同上)
  • 如果起始标志为 0 且 url 为 'in_field',则代码映射等于 0 ***需要调整逻辑

*** 此字段需要等于 0,因为在此特定会话(会话 B)中,起始 URL 不等于我定义的字段,因此 code_map 的所有值都需要等于 0仅当满足此特定条件时。

【问题讨论】:

  • 您在段落中说“如果起始标志为 0 且 url 为 'in_field',则 code_map 等于 1(完成)”然后您说“如果起始标志为 0 且 url 为” in_field',则代码映射等于 0"。你想要哪个?是否依赖于 test.session?
  • 依赖于 start.flag 和 url。因此,如果起始标志等于 1,并且 url 等于“not_in_list”,那么对于该会话中的所有 url,我需要代码返回 0,即使起始标志为 0 且 url 为“in_field”,因为起始 URL 不在建议的列表中

标签: r filter logic conditional-statements


【解决方案1】:

理解你想要什么有点令人困惑,但似乎如果一个测试会话有一个 test.url “not_in_list”,那么该测试会话的所有 test.code_maps 应该是 0。如果是这样,这应该工作

test.df$test.code_map<-ifelse(
  ((test.df$test.start_flag == 1 & test.df$test.url=="in_list")|
  (test.df$test.start_flag == 0 & test.df$test.url=="in_field"& test.df$test.session!="B") &
    !test.session %in% test.df$test.session[test.df$test.url=="not_in_list"]),
  1, 0)

【讨论】:

  • 是的 - 如果我们只是在这个测试 sn-p 上运行代码,这确实工作得很好。我将需要在超过 300k + 会话 ID 上运行此代码,因此当我们编写 test.code_map 时,它必须在每个会话中都是动态的。但是逻辑是正确的,每次有一个新会话名称的起始 url 不等于值“in_list”时,那么对于该特定会话中的每一行 test.code_map 必须等于 0
  • 其实我现在正在测试它,它看起来不错!采取了不同的方法,但这使它变得更加清洁和容易,谢谢!
  • 感谢它做了一些小的调整!我需要向数据集添加一个结束标志,我可以轻松地做到这一点(如果 url 是会话中的最后一个 url,则为 1,否则为 0)。如果 end_flag 等于 '1' 并且 url 是 'out',我们如何调整此代码以使 test.code_map 等于 1?这将是对上述代码的补充。
  • 这很简单,只需在上面的代码中添加逻辑测试(test.df$test.code_map==1 & test.df$test.url=="out")即可。你可以把它放在最后一个“&”符号之前的任何地方
  • 非常感谢!! *****(test.df$**end_flag**==1 & test.df$test.url=="out")
猜你喜欢
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2016-03-11
相关资源
最近更新 更多