当某些键有多个值时使用 tidyr::pivot_wider

Using tidyr::pivot_wider when some keys have multiple values

我有一个很长的数据框,我想加宽,但是一个键有两个不同的值:

df <- data.frame(ColA=c("A", "B", "B", "C"), ColB=letters[23:26])

  ColA ColB
1    A    w
2    B    x
3    B    y
4    C    z

我希望我的输出是此键的两个值的粘贴:

  ColA ColB
1    A    w
2    B    xy
3    C    z

常规 pivot_wider() 将发出警告并将值转换为列表:

df.wide <- df %>%
    pivot_wider(names_from=ColA, values_from=ColB)

Warning message:
Values are not uniquely identified; output will contain list-cols.
* Use `values_fn = list` to suppress this warning.
* Use `values_fn = length` to identify where the duplicates arise
* Use `values_fn = {summary_fun}` to summarise duplicates 

# A tibble: 1 x 3
  A         B         C        
  <list>    <list>    <list>   
1 <chr [1]> <chr [2]> <chr [1]>

根据警告,带有 value_fn()pivot_wider() 与我想要的中间步骤类似:

# intermediate step
df.wide <- df %>%
    pivot_wider(names_from=ColA, values_from=ColB, values_fn=SOMETHING)

   A  B  C
1  w  xy z

但看起来 values_fn() 只接受汇总函数,而不是对字符数据起作用的函数(比如 paste()

我能得到的最接近的是:

df %>%
  pivot_wider(names_from=ColA, values_from=ColB, values_fn=list) %>% 
  mutate(across(everything(), as.character)) %>%
  pivot_longer(cols=everything(), names_to="ColA", values_to="ColB")

# A tibble: 3 x 2
  ColA  ColB             
  <chr> <chr>            
1 A     "w"              
2 B     "c(\"x\", \"y\")"
3 C     "z" 

具有额外的变异 gsub() 类型的功能。当然有更简单的方法!最好在tidyverse内,也可以对其他包开放。

谢谢

我认为您不需要在这里转换,除非您的真实数据比显示的示例更复杂。

library(dplyr)

df %>% 
  group_by(ColA) %>% 
  summarise(ColB = paste0(ColB, collapse = ""))

结果:

# A tibble: 3 × 2
  ColA  ColB 
  <chr> <chr>
1 A     w    
2 B     xy   
3 C     z