仅返回与两个条件过滤器匹配的值

时间:2018-03-02 15:39:00

标签: r dplyr

我试图只返回与2条件过滤器匹配的值。我遇到的问题是有些名称有1个以上的代码而有些名称只有1个。

name <- c("Jeff", "Jeff", "Jill", "Jill", "Angie")
total <- c(123, 234, 345, 456, 567)
code <- c("abc", "xyz", "abc", "xyz", "abc")

table <- data.frame(name, total, code)

全桌

name  total code
Jeff  123   abc
Jeff  234   xyz
Jill  345   abc
Jill  456   xyz
Angie 567   xyz

我正在寻找的输出是

name  total code
Jeff  123   abc
Jeff  234   xyz
Jill  345   abc
Jill  456   xyz

我试过了 这不起作用,因为它返回所有预期的

library(dplyr)

test1 <- filter(table, code == "xyz" | code == "abc")

我想也许%&gt;%会起作用,但这给了我与OR过滤器相同的东西。

target <- c("xyz", "abc")
test2 <- filter(table, code %in% target)

我不能使用“AND”因为它在同一列中。

test2 <- filter(table, code == "xyz" & code == "abc")

3 个答案:

答案 0 :(得分:2)

我会将您的目标定为“选择在其代码列中同时包含xyzabc的所有名称。”您尝试的主要问题是您'没有做任何表示需要按名称​​执行此操作 - 您只引用了code列。我们需要使用group_by(name)

table %>% group_by(name) %>% 
    filter("abc" %in% code & "xyz" %in% code)
# # A tibble: 4 x 3
# # Groups:   name [2]
#     name total   code
#   <fctr> <dbl> <fctr>
# 1   Jeff   123    abc
# 2   Jeff   234    xyz
# 3   Jill   345    abc
# 4   Jill   456    xyz

我们还需要使用%in%而不是==,因为我们要检查代码列中每个模式是否存在某处==将尝试仅选择具有该模式的各个行,正如您所指出的那样,将导致没有&条件的行,因为code不能同时为{{1}和abc同时。 (Flo.P使用xyzany使用的角色相同。)

答案 1 :(得分:1)

这应该有效

def check_offline(text):
    list_pro = open('full-list-bad.txt','r')

    content = list_pro.readline()
    for ligne in content :
        if ligne in text :
            remplacement = "*" * len(ligne)
            text = text.replace(ligne ,remplacement)
            print ligne

    return text

print check_offline("this is a  shit world " )

答案 2 :(得分:0)

诀窍是使用%in%和&#34;和&#34;。以下是一些示例代码:

target_name = c("Jeff", "Jill")
target_code = c("abc", "xyz")

table %>%
     filter( name %in% target_name & code %in% target_code)

输出是您想要的示例:

> table %>%
+   filter( name %in% target_name & code %in% target_code)
    name total code
    1 Jeff   123  abc
    2 Jeff   234  xyz
    3 Jill   345  abc
    4 Jill   456  xyz

希望它有所帮助。