R dplyr过滤器与if else语句不起作用

时间:2018-11-11 19:35:03

标签: r if-statement

我正在尝试使其工作:

test.ROOT.triples <- triples %>%
  filter(dep_rel.y %in% c("ROOT"),
     {
       if(verb_head_token_id == neg.adverb_head_token_id) filter (subject_head_token_id == neg.adverb_head_token_id,
                                                                  verb_head_token_id == neg.adverb_head_token_id,
                                                                  verb_token_id == object_head_token_id)
       else
         filter(subject_head_token_id == verb_head_token_id,
                verb_token_id == object_head_token_id))
     }

我的语法不太正确。我收到有关无与伦比的左括号和右括号的消息。

如果未在if / else语句中使用此代码,则可以使用,但是我想在if / else语句中使用dplyr过滤器。

先谢谢您。

1 个答案:

答案 0 :(得分:0)

如果dplyr中的else语句具有某种特殊的语法,则我永远不会在Filter中使用它们,而且我不确定这是否可行。一种解决方案可能是仅过滤两个单独的数据帧,然后在需要时将它们加入。

为了便于阅读,我将过滤器语句分开,但是您可以将它们全部放在同一过滤器语句中,并用逗号分隔。

triples %>%
filter(dep_rel.y %in% c("ROOT")) %>%
filter(verb_head_token_id == neg.adverb_head_token_id) %>%
filter(subject_head_token_id == neg.adverb_head_token_id) %>%
filter(verb_head_token_id == neg.adverb_head_token_id) %>% 
filter(verb_token_id == object_head_token_id) -> FirstDF

triples %>%
filter(dep_rel.y %in% c("ROOT")) %>%
filter(subject_head_token_id == verb_head_token_id) %>%
filter(verb_token_id == object_head_token_id) -> SecondDF

您可以查找rbind来重新连接它们(如果您甚至愿意,我认为下游分析会有所不同,因此将它们分开可能会更干净)。

只是为了向您展示if else语句如何在dplyr管道中工作,您可以创建一个索引来用新变量标记不同质量的行。演示了dplyr中IF Else的结构:

NewItem = if_else(logicals, WhatHappensIfTrue, WhatHappensIfFalse)

triples %>% mutate(Category = if_else(verb_head_token_id == neg.adverb_head_token_id &
subject_head_token_id == neg.adverb_head_token_id &
verb_head_token_id == neg.adverb_head_token_id &
verb_token_id == object_head_token_id, #comma denotes end of "if" logical
1, #This 1 is what happens if logical(s) TRUE
0)) #The zero is "else" - when logical(s) FALSE. It CAN be another if_else.