【问题标题】:transpose data in one column based on unique values in another column [duplicate]根据另一列中的唯一值转置一列中的数据[重复]
【发布时间】:2021-08-03 06:25:41
【问题描述】:

我基本上想做 r 中描述的here

示例数据

names<-c("k127_60234", "k127_60234","k127_60234","k127_60234","k127_50234","k127_50234")
values<-c("ko235", "ko123", "ko543", "ko623", "ko443", "ko123")
df <- data.frame (names,values)

这是我希望输出的样子 - 作为记录,实际文件会更大(最多 tp 200k),因此我无法事先定义列数

names<-c("k127_60234", "k127_50234")
values1<-c("ko235", "ko443")
values2<-c("ko123", "ko123")
values3<-c("ko543",NA)
values4<-c("ko623",NA)
df.out <- data.frame (names,values1,values2,values3,values4)

【问题讨论】:

    标签: r unique reshape transpose


    【解决方案1】:

    我们可以在一行中使用dcast

    library(data.table)
    dcast(setDT(df), names ~ paste0('values', rowid(names)))
    

    -输出

    #       names values1 values2 values3 values4
    #1: k127_50234   ko443   ko123    <NA>    <NA>
    #2: k127_60234   ko235   ko123   ko543   ko623
    

    或者使用tidyverse

    library(dplyr)
    library(tidyr)
    library(stringr)
    df %>%
       mutate(nm1 = str_c('values', rowid(names))) %>%
       pivot_wider(names_from = nm1, values_from = values)
    

    -输出

    # A tibble: 2 x 5
    #  names      values1 values2 values3 values4
    #  <chr>      <chr>   <chr>   <chr>   <chr>  
    #1 k127_60234 ko235   ko123   ko543   ko623  
    #2 k127_50234 ko443   ko123   <NA>    <NA>   
    

    或使用base R

    do.call(rbind, lapply(unstack(df[2:1]), `length<-`, 4))
    

    【讨论】:

      【解决方案2】:
      library(tidyverse)
      df %>%
        group_by(names) %>%
        mutate(variable = str_c("values", row_number())) %>%
        pivot_wider(names_from = variable, values_from = values)
      
       names      values1 values2 values3 values4
        <chr>      <chr>   <chr>   <chr>   <chr>  
      1 k127_60234 ko235   ko123   ko543   ko623  
      2 k127_50234 ko443   ko123   NA      NA   
      

      在基础 R 中你可以这样做:

      df1 <- transform(df, time = ave(values, names, FUN = seq))
      reshape(df1, idvar = "names", dir="wide", sep="")
      
             names values1 values2 values3 values4
      1 k127_60234   ko235   ko123   ko543   ko623
      5 k127_50234   ko443   ko123    <NA>    <NA>
                 
      

      【讨论】:

        【解决方案3】:

        这可能会有所帮助:

        df %>% tidyr::spread(values, value = values)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-16
          • 2015-08-03
          • 2019-08-29
          • 1970-01-01
          • 2020-02-08
          • 1970-01-01
          • 2022-12-15
          相关资源
          最近更新 更多