无法将tidyselect`everything()`与`group_by()`和`fill()`结合使用

时间:2019-10-24 13:25:20

标签: r dplyr tidyr tidyselect

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'值,以便沿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))选项。是否存在?

1 个答案:

答案 0 :(得分:2)

您可以这样做:

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和之间的所有变量   用x:z表示z,用-y排除y。