【问题标题】:Unable to use tidyselect `everything()` in combination with `group_by()` and `fill()`无法将 tidyselect `everything()` 与 `group_by()` 和 `fill()` 结合使用
【发布时间】:2019-10-24 13:25:20
【问题描述】:
library(tidyverse)
df <- tibble(x1 = c("A", "A", "A", "B", "B", "B"),
             x2 = c(NA, 8, NA, NA, NA, 5),
             x3 = c(3, 6, 5, 9, 1, 9))
#> # A tibble: 6 x 3
#>   x1       x2    x3
#>   <chr> <dbl> <dbl>
#> 1 A        NA     3
#> 2 A         8    NA
#> 3 A        NA     5
#> 4 B        NA     9
#> 5 B        NA     1
#> 6 B         5     9

x1 列中显示了组“A”和“B”。我需要 x2x3 列中的 'NA' 值来填充 only 从同一组内的值,在 updown 方向。很简单,代码如下:

df %>% group_by(x1) %>% fill(c(x2, x3), .direction = "updown")
#> # A tibble: 6 x 3
#>   x1       x2    x3
#>   <chr> <dbl> <dbl>
#> 1 A         8     3
#> 2 A         8     5
#> 3 A         8     5
#> 4 B         5     9
#> 5 B         5     1
#> 6 B         5     9

我的现实问题是我的数据框不只包含列x1x3。它更像是x1x100。并且列名非常随机,没有逻辑顺序。为了省去在其中输入所有 ~100 列的麻烦,我尝试了 tidyselect everything() 参数,如下所示。但这会产生一个可以理解的错误。我不知道如何解决它。

df %>% group_by(x1) %>% fill(everything(), .direction = "updown")
#> Error: Column `x1` can't be modified because it's a grouping variable

I asked a related question yesterday,关于命名everything() 参数的异常,在我的方法中过于简单,因此导致对我想在解决方案中看到的意图产生混淆。建议的解决方案“您可以使用select(-variable)”在我上面概述的情况下不起作用(我相信)。因此,这个新问题。我该怎么办?

我还应该提到,简单地选择数字列序列(即2:100)是行不通的,因为我需要按名称挑选一些列(例如x45x70)。并且列的顺序可以逐月更改,我必须按列名挑选。所以使用everything()everything_but(column.names = c(x45, x70)) 选项将是我真正想要的。存在吗?

【问题讨论】:

    标签: r dplyr tidyr tidyselect


    【解决方案1】:

    你可以这样做:

    df %>%
     group_by(x1) %>%
     fill(-x1, .direction = "updown")
    
      x1       x2    x3
      <chr> <dbl> <dbl>
    1 A         8     3
    2 A         8     6
    3 A         8     5
    4 B         5     9
    5 B         5     1
    6 B         5     9
    

    此行为记录在tidyr 的文档中(另请查看@Gregor 的评论):

    您可以提供裸变量名称,选择 x 和之间的所有变量 z 与 x:z,排除 y 与 -y。

    【讨论】:

    • 值得解释everything() 本质上是fill 的默认值,所以OP 对fill(everything_but(x1), ...) 的请求比他们认为的fill(-x1, ...) 更简单。
    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2023-02-15
    • 2018-04-06
    • 2021-02-05
    相关资源
    最近更新 更多