4

我有按地区划分的不同候选人的选举结果。来源有每个候选人的票数和每个选区的总票数。我想为每个候选人在每个选区获得的选票百分比添加变量。

我已经成功地使用mutatewithacross将投票计数替换为百分比,但是在尝试使用该.names参数创建新变量时出现错误(即,我希望得到新变量,,,,cand1_pct... cand2_pct)。

library(tidyverse)
df <- data.frame(district = 1:3,
                 cand1 = c(12, 2, 14),
                 cand2 = c(2, 6, 23),
                 cand3 = c(3, 16, 2),
                 total = c(17, 24, 39))
df %>% 
  mutate(across(2:4, ~ .x/total*100))
#>   district     cand1    cand2     cand3 total
#> 1        1 70.588235 11.76471 17.647059    17
#> 2        2  8.333333 25.00000 66.666667    24
#> 3        3 35.897436 58.97436  5.128205    39
  
df %>% 
  mutate(across(2:4, ~ .x/total*100, .names = "{.col}_pct"))
#> Error: Problem with `mutate()` input `..1`.
#> x glue cannot interpolate functions into strings.
#> * object '.col' is a function.
#> i Input `..1` is `across(2:4, ~.x/total * 100, .names = "{.col}_pct")`.

reprex 包(v0.3.0)于 2020 年 8 月 12 日创建

我首先认为这是我对如何across以及.names应该如何工作的误解,但是当我使用across 小插图中的示例时,我得到了同样的错误。我在本地机器和 RStudio 云上都试过了。dplyr1.0.1 版。

library(dplyr)

iris %>%
  group_by(Species) %>%
  summarise(across(starts_with("Sepal"), mean, .names = "mean_{.col}"))
#> Error: Problem with `summarise()` input `..1`.
#> x glue cannot interpolate functions into strings.
#> * object '.col' is a function.
#> i Input `..1` is `across(starts_with("Sepal"), mean, .names = "mean_{.col}")`.
#> i The error occurred in group 1: Species = "setosa".

reprex 包(v0.3.0)于 2020 年 8 月 12 日创建

4

2 回答 2

5

根据?across, 不是.col, 只是col

.names - 对于单函数情况,默认值 (NULL) 等效于“{col}”,对于 .fns 使用列表的情况,默认值 (NULL) 等效于“{col}_{fn}”。

library(dplyr)
df %>% 
   mutate(across(2:4, ~ .x/total*100, .names = "{col}_pct"))
#  district cand1 cand2 cand3 total cand1_pct cand2_pct cand3_pct
#1        1    12     2     3    17 70.588235  11.76471 17.647059
#2        2     2     6    16    24  8.333333  25.00000 66.666667
#3        3    14    23     2    39 35.897436  58.97436  5.128205
于 2020-08-12T20:43:01.370 回答
1

...事情变了。

根据?across最新的dplyr 1.0.2,现在推荐使用.col,而不是col

.names - 描述如何命名输出列的粘合规范。这可以使用 {.col} 代表选定的列名,使用 {.fn} 代表正在应用的函数的名称。对于单函数情况,默认值 (NULL) 等效于“{.col}”,对于 .fns 使用列表的情况,默认值 (NULL) 等效于“{.col}_{.fn}”。

更多信息和用例可以在这里找到:stackoverflow:在 dplyr 中使用多个列的函数

于 2020-12-08T13:23:37.353 回答