小编Tam*_*agy的帖子

使用tidyverse进行条件过滤

我想根据可能存在或不存在的变量来过滤我的数据框.作为预期的输出,我想要一个被过滤的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内?

r dplyr tidyverse

6
推荐指数
1
解决办法
1307
查看次数

使用 `dplyr::mutate()` 从向量中指定的名称创建几个新变量

我想在数据框中创建几个新的空变量,在其中指定向量中的变量名称。如果我只指定一个变量名,但会中断多个变量名,则此方法有效。我尝试了一些以前的解决方案,但在这种情况下它们似乎不起作用,例如:


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)

r dplyr tidyverse tidyeval

4
推荐指数
1
解决办法
1084
查看次数

如何使用mutate_all并使用dplyr正确重新编码?

我一直在尝试使用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)

r dplyr recode

1
推荐指数
1
解决办法
1987
查看次数

标签 统计

dplyr ×3

r ×3

tidyverse ×2

recode ×1

tidyeval ×1