无法将 tidyselect `everything()` 与 `group_by()` 和 `fill()` 结合使用
Unable to use tidyselect `everything()` in combination with `group_by()` and `fill()`
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'。我需要 x2
和 x3
列中的 '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
我的现实问题是我的数据框不仅仅包含 x1
到 x3
列。它更像是 x1
到 x100
。而且列名非常随机,没有逻辑顺序。为了省去输入所有 ~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
)是行不通的,因为我需要按名称挑选一些列(例如 x45
、x70
).并且列的顺序可以逐月更改,我必须按列名称进行挑选。因此,使用 everything()
和 everything_but(column.names = c(x45, x70))
选项才是我真正想要的。它存在吗?
你可以这样做:
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 的评论):
You can supply bare variable names, select all variables between x and
z with x:z, exclude y with -y.
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'。我需要 x2
和 x3
列中的 '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
我的现实问题是我的数据框不仅仅包含 x1
到 x3
列。它更像是 x1
到 x100
。而且列名非常随机,没有逻辑顺序。为了省去输入所有 ~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
)是行不通的,因为我需要按名称挑选一些列(例如 x45
、x70
).并且列的顺序可以逐月更改,我必须按列名称进行挑选。因此,使用 everything()
和 everything_but(column.names = c(x45, x70))
选项才是我真正想要的。它存在吗?
你可以这样做:
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 的评论):
You can supply bare variable names, select all variables between x and z with x:z, exclude y with -y.