三行代码  ›  专栏  ›  技术社区  ›  TarJae

轴心线

  •  1
  • TarJae  · 技术社区  · 1 月前

    我试着按字母顺序对每一行排序(为了解决这个问题) 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   TGC   TGA    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 分组后,一切正常,如下所示:

    enter image description here

    但是当我使用 pivot_wider 向后旋转,订单解散。就像这里:

    enter image description here

    原因是, names_from name

    我想知道 有没有一个解决办法可以在之后维持订单 那是我安排的 之前

    2 回复  |  直到 1 月前
        1
  •  2
  •   akrun    1 月前

    我们可以使用 pmap sort 具有 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 安排

    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)
    

    #答:4
    备选方案1备选方案2备选方案3备选方案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>
    
        2
  •  1
  •   IceCreamToucan    1 月前

    pmap rowwise

    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))
    
    library(dplyr, warn.conflicts = FALSE)
    
    df %>%
      rowwise() %>%
      mutate(c_across(everything()) %>%
        sort(na.last = TRUE) %>%
        as.data.frame.list() %>%
        setNames(names(df)))
    #> # A tibble: 4 × 4
    #> # Rowwise: 
    #>   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>
    

    于2021年11月28日由 reprex package (v2.0.1)

        3
  •  1
  •   deschen    1 月前

    df %>%
      rowwise() %>%
      mutate(new = list(sort(c_across(everything())))) %>%
      ungroup() %>%
      select(new) %>%
      unnest_wider(new, names_repair = ~names(df))