如何使用双pivot_longer解决与名称修复startegy相关的错误

问题描述 投票:0回答:1

我一直在尝试使用以下代码将单独的列转换为长格式:

mtcars %>% 
  pivot_longer(1:3, values_to = 'values') %>% 
  pivot_longer(6:7, values_to = 'values1')

但是,我收到以下错误

**Error in `pivot_longer()`:
! Names must be unique.
x These names are duplicated:
  * "name" at locations 7 and 9.
i Use argument `names_repair` to specify repair strategy.
Run `rlang::last_trace()` to see where the error occurred.**

任何人都可以知道如何避免此错误以及如何将不同的列块单独转换为长格式,可能在同一个

pivot_longer
调用中?

谢谢

r dataframe dplyr pivot data-cleaning
1个回答
1
投票

通过查看文档和代码的第一部分可以看到答案。

文档

这些是

pivot_longer()
的参数,以及它们的默认参数(如果有):

pivot_longer(
  data,
  cols,
  ...,
  cols_vary = "fastest",
  names_to = "name", <--- important part
  names_prefix = NULL,
  names_sep = NULL,
  names_pattern = NULL,
  names_ptypes = NULL,
  names_transform = NULL,
  names_repair = "check_unique",
  values_to = "value",
  values_drop_na = FALSE,
  values_ptypes = NULL,
  values_transform = NULL
)

如您所见,如果您没有为名称列指定名称(使用

names_to
参数),则默认名称为“name”。

您的代码

运行

mtcars %>% pivot_longer(1:3, values_to = 'values')
,我们得到输出:

# A tibble: 96 × 10
      hp  drat    wt  qsec    vs    am  gear  carb name  values
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>  <dbl>
 1   110  3.9   2.62  16.5     0     1     4     4 mpg     21  
 2   110  3.9   2.62  16.5     0     1     4     4 cyl      6  
 3   110  3.9   2.62  16.5     0     1     4     4 disp   160  
 4   110  3.9   2.88  17.0     0     1     4     4 mpg     21  
 5   110  3.9   2.88  17.0     0     1     4     4 cyl      6  
 6   110  3.9   2.88  17.0     0     1     4     4 disp   160  
 7    93  3.85  2.32  18.6     1     1     4     1 mpg     22.8
 8    93  3.85  2.32  18.6     1     1     4     1 cyl      4  
 9    93  3.85  2.32  18.6     1     1     4     1 disp   108  
10   110  3.08  3.22  19.4     1     0     3     1 mpg     21.4
# ℹ 86 more rows

注意到最后的“名称”栏了吗?当我们尝试在此之后运行

pivot_longer(6:7, values_to = 'values1')
时,我们试图再次创建一个“名称”列,但我们已经有了一个,所以 dplyr 吓坏了并抛出此错误。

我们可以做一些事情:

  1. 为名称列分配名称(例如,对第一个列使用
    names_to = "name1"
    ,对第二个列使用
    names_to = "name2"
  2. 为names_repair添加一个选项:引用文档-

默认情况下,如果列重复,“check_unique”就会出错。使用“最小”允许输出中存在重复项,或使用“唯一”通过添加数字后缀来消除重复。请参阅 vctrs::vec_as_names() 了解更多选项。

  1. 使用
    names_to = NULL
    删除名称列
© www.soinside.com 2019 - 2024. All rights reserved.