延长具有重复名称的数据框

Lengthen data frame with duplicate names

我有一个 data.frame,其中包含我想要加长的重复列名。我不想修改名称,因为它们对应于我未来专栏中的值。我正在尝试使用 pivot_longer 但它会引发错误。

Error: Can't transform a data frame with duplicate names.

我查看了该函数的文档并使用“names_repair”参数来解决这个问题,但它没有帮助。

我还在 tidyvere 的 github 上发现了 this 问题,但我不确定那里发生了什么。

这是我的代码:

library(dplyr)
library(tidyr)
df %>% 
  mutate_all(as.character) %>% 
  pivot_longer(-a, names_to = "Names", values_to = "Values", names_repair = "minimal")

有办法吗?

期望的输出:

  a     Names Values
  <chr> <chr> <chr> 
1 1     b     4     
2 1     c     a     
3 1     c     d     
4 2     b     5     
5 2     c     b     
6 2     c     e     
7 3     b     6     
8 3     c     c     
9 3     c     f 

示例数据:

df <- setNames(data.frame(c(1,2,3), 
                          c(4,5,6), 
                          c("a","b","c"), 
                          c("d","e","f"), 
                          stringsAsFactors = F), 
               c("a","b","c","c"))

问题不在于 pivot_wider,它可以用于包含同名列的 data.frame - mutate 不能。因此,我们需要通过(i)使用基数 R 或(ii)如果您想留在更大的 tidyverse purrr::modify_at 中,将列转换为字符列(毕竟 data.frame 始终是 list).之后它只是对 pivot_wider.

的常规调用
df <- setNames(data.frame(c(1,2,3), 
                          c(4,5,6), 
                          c("a","b","c"), 
                          c("d","e","f"), 
                          stringsAsFactors = F), 
               c("a","b","c","c"))

library(dplyr)
library(tidyr)

# Alternatively use base R to transform cols to character
# df[,c("a", "b")] <- lapply(df[,c("a", "b")], as.character)

df %>%
  purrr::modify_at(c("a","b"), as.character) %>% 
  pivot_longer(-a,
               names_to = "Names",
               values_to = "Values")
#> # A tibble: 9 x 3
#>   a     Names Values
#>   <chr> <chr> <chr> 
#> 1 1     b     4     
#> 2 1     c     a     
#> 3 1     c     d     
#> 4 2     b     5     
#> 5 2     c     b     
#> 6 2     c     e     
#> 7 3     b     6     
#> 8 3     c     c     
#> 9 3     c     f

reprex package (v0.3.0)

于 2021-02-23 创建