Pivot_Wide融合排列 [英] pivot_wider dissolves arrange

查看:19
本文介绍了Pivot_Wide融合排列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试按字母顺序对每一行进行排序(为了解决此问题Reshaping a dataframe in R by sorting just some fields in a row alphabetically

这是数据帧:

df <- structure(list(ALT_1 = c("GAT", "TGC", "AGC", "T"), ALT_2 = c("CAG", 
"TGA", "CGC", NA), ALT_3 = c("G", NA, "TGA", NA), ALT_4 = c("AGT", 
NA, NA, NA)), class = "data.frame", row.names = c(NA, -4L))

  ALT_1 ALT_2 ALT_3 ALT_4
1   GAT   CAG     G   AGT
2   TGC   TGA  <NA>  <NA>
3   AGC   CGC   TGA  <NA>
4     T  <NA>  <NA>  <NA>

预期输出:

  ALT_1 ALT_2 ALT_3 ALT_4
1   AGT   CAG     G   GAT
2   TGA   TGC    NA    NA
3   AGC   CGC   TGA    NA
4     T    NA    NA    NA

为了实现这一点,我使用以下代码:

library(dplyr)
library(tidyr)
df %>% 
  mutate(id = row_number()) %>% 
  pivot_longer(
    -id
  ) %>% 
  group_by(id) %>% 
  arrange(value, .by_group = TRUE) %>% 
  pivot_wider(
    names_from = name,
    values_from = value
  )

并获得以下内容:

     id ALT_4 ALT_2 ALT_3 ALT_1
  <int> <chr> <chr> <chr> <chr>
1     1 AGT   CAG   G     GAT  
2     2 NA    TGA   NA    TGC  
3     3 NA    CGC   TGA   AGC  
4     4 NA    NA    NA    T

我找到了问题所在: 如果我在pivot_longer之后停止并在分组后使用arrange,则一切正常,如下所示:

但当我使用pivot_wider旋转回枢轴时,顺序就消失了。如下所示:

原因是names_from参数保持其原始顺序-&>此处name

我想知道 arrange安排的pivot_wider之后的顺序是否有解决方案?

推荐答案

我们可以使用pmap循环行,使用na.last = TRUE

library(purrr)
pmap_dfr(df, ~ setNames(sort(c(...), na.last =TRUE), names(df)))

-输出

# A tibble: 4 × 4
  ALT_1 ALT_2 ALT_3 ALT_4
  <chr> <chr> <chr> <chr>
1 AGT   CAG   G     GAT  
2 TGA   TGC   <NA>  <NA> 
3 AGC   CGC   TGA   <NA> 
4 T     <NA>  <NA>  <NA> 

如果要使用pivot_longer/pivot_wider而不是arrange,请在mutate中使用sort,因为arrange不会破坏‘name’列的顺序。

library(dplyr)
library(tidyr)
df %>% 
  mutate(id = row_number()) %>% 
  pivot_longer(
    -id
  ) %>% 
  group_by(id) %>% 
  mutate(value = sort(value, na.last = TRUE)) %>% 
  ungroup %>%
  pivot_wider(
    names_from = name,
    values_from = value
  ) %>%
  select(-id)

-输出

# A tibble: 4 × 4
  ALT_1 ALT_2 ALT_3 ALT_4
  <chr> <chr> <chr> <chr>
1 AGT   CAG   G     GAT  
2 TGA   TGC   <NA>  <NA> 
3 AGC   CGC   TGA   <NA> 
4 T     <NA>  <NA>  <NA> 

这篇关于Pivot_Wide融合排列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆