我想根据可能存在或不存在的变量来过滤我的数据框.作为预期的输出,我想要一个被过滤的df(如果它有过滤器变量),或者原始的,未过滤的df(如果缺少变量).
这是一个最小的例子:
library(tidyverse)
df1 <-
tribble(~a,~b,
1L,"a",
0L, "a",
0L,"b",
1L, "b")
df2 <- select(df1, b)
Run Code Online (Sandbox Code Playgroud)
过滤df1返回所需的结果,过滤后的tibble.
filter(df1, a == 1)
# A tibble: 2 x 2
a b
<int> <chr>
1 1 a
2 1 b
Run Code Online (Sandbox Code Playgroud)
但是第二个抛出错误(预期),因为变量不在df中.
filter(df2, a == 1)
Error in filter_impl(.data, quo) :
Evaluation error: object 'a' not found.
Run Code Online (Sandbox Code Playgroud)
我试过filter_at,这将是一个明显的选择,但如果没有与困境相匹配的变量,它会抛出错误.
filter_at(df2, vars(matches("a")), any_vars(. == 1L))
Error: `.predicate` has no matching columns
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:有没有办法创建一个产生预期结果的条件过滤,最好是在tidyverse内?
我想在数据框中创建几个新的空变量,在其中指定向量中的变量名称。如果我只指定一个变量名,但会中断多个变量名,则此方法有效。我尝试了一些以前的解决方案,但在这种情况下它们似乎不起作用,例如:
library(dplyr)
add_columns <- function(df, columns){
columns <- quo(columns)
mutate(df, !!columns := NA_character_)
}
columns <- c("x", "y")
iris %>%
add_columns(columns)
Error: The LHS of `:=` must be a string or a symbol
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
# A tibble: 150 x 7
Sepal.Length Sepal.Width Petal.Length Petal.Width Species x y
<dbl> <dbl> <dbl> <dbl> <fct> <chr> <chr>
1 5.10 3.50 1.40 0.200 setosa NA NA
2 4.90 3.00 1.40 0.200 setosa NA NA
3 4.70 3.20 1.30 …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用recode的dplyr变体,结合mutate_all对数据集中的所有变量,但它不会产生预期的输出.我发现的其他答案没有解决这个问题(例如dplyr中的Recode和Mutate_all)
这是我尝试过的:
library(tidyverse)
library(car)
# Create sample data
df <- data_frame(a = c("Yes","Maybe","No","Yes"), b = c("No","Maybe","Yes","Yes"))
# Using dplyr::recode
df %>% mutate_all(funs(recode(., `1` = "Yes", `0` = "No", `NA` = "Maybe")))
Run Code Online (Sandbox Code Playgroud)
对价值没有影响:
# A tibble: 4 × 2
a b
<chr> <chr>
1 Yes No
2 Maybe Maybe
3 No Yes
4 Yes Yes
Run Code Online (Sandbox Code Playgroud)
我想要的可以用car :: Recode重现:
# Using car::Recode
df %>% mutate_all(funs(Recode(., "'Yes' = 1; 'No' = 0; 'Maybe' = NA")))
Run Code Online (Sandbox Code Playgroud)
这是期望的结果:
# A tibble: 4 × …Run Code Online (Sandbox Code Playgroud)