我刚刚开始使用dplyr并浏览了小插图,它没有符合我要求的示例。我无法弄清楚如何filter()使用等效于“删除 columnX 等于 'i' 或 columnY 等于 'ii' 的所有情况的语句在数据框中使用多个变量。假设我们有这个数据框。
df <- data.frame(n = rep(1:4,4), l = rep(letters[1:4], each = 4))
Run Code Online (Sandbox Code Playgroud)
我想删除所有 n = 1 或 l = "a" 的情况。我可以用这个命令用标准子集来做到这一点。
df[-which(df$n == 1 | df$l == "a"),]
Run Code Online (Sandbox Code Playgroud)
使用filter我可以摆脱所有的 1
filter(df, !n == 1)
Run Code Online (Sandbox Code Playgroud)
或者
filter(df, n != 1)
Run Code Online (Sandbox Code Playgroud)
和“a”相同
但是如果我试着把它们像这样结合起来
filter(df, !n == 1 | !l == "a")
Run Code Online (Sandbox Code Playgroud)
或者
filter(df, n != 1 | l != "a")
Run Code Online (Sandbox Code Playgroud)
或者
filter(df, !n == 1 | l == "a")
Run Code Online (Sandbox Code Playgroud)
似乎“或”函数|在 dplyr 中的工作方式不同。
或者也许我只是错过了一些非常明显的东西。
任何帮助表示赞赏。
如果你不希望这两种情况都发生,你必须这样写:
df %>% filter(!(n == 1 | l == "a"))
Run Code Online (Sandbox Code Playgroud)
//
至于你的例子,
df %>% filter(n != 1 | l != "a")
Run Code Online (Sandbox Code Playgroud)
相当于
df %>% filter(!n == 1 | !l == "a")
Run Code Online (Sandbox Code Playgroud)
其中,使用德摩根定律即(!(a & b)) = (!a | !b),与以下内容相同:
df %>% filter(! (n == 1 & l == "a"))
Run Code Online (Sandbox Code Playgroud)
并过滤出同时满足两个条件的所有行。
你的例子
df %>% filter(!n == 1 | l == "a")
Run Code Online (Sandbox Code Playgroud)
只会禁止n == 1和l != "a"出现在同一行的情况,所以 (1,b); 数据框中缺少 (1,c) 和 (1,d)。(符号:(n,l))
| 归档时间: |
|
| 查看次数: |
5649 次 |
| 最近记录: |