代码之家  ›  专栏  ›  技术社区  ›  user113156

dplyr使用pipe函数将colnames替换为第一行并删除第一行

  •  1
  • user113156  · 技术社区  · 6 年前

    我试图将第一行设置为数据中的列名,但是我的数据包含许多因素,这会导致一些问题。

    我正在尝试使用 dplyr

    Str() 数据类型:

    'data.frame':   2 obs. of  8 variables:
     $ 1   : Factor w/ 2045 levels " 200039"," 200171",..: 2045 1
     $ 2   : Factor w/ 3 levels " DR"," GR"," OU": 3 2
     $ 1372: Factor w/ 1388 levels "       12","       15",..: 1388 1372
     $ 4   : Factor w/ 51 levels " ATLANTA             ",..: 21 4
     $ NA  : logi  NA NA
     $ 63  : Factor w/ 498 levels " 435"," 436",..: 498 63
     $ 95  : Factor w/ 264 levels " 1114"," 1115",..: 264 95
     $ 118 : Factor w/ 132 levels " Chain1  "," Chain10 ",..: 131 118
    

    我正在使用以下代码

    x <- df %>%
      setNames(df[1, ])
    

    它提供了以下输出:

         2045   3      1388                    21 NA  498   264       131
    1 IRI_KEY  OU  EST_ACV   Market_Name          NA Open  Clsd  MskdName
    2  200039  GR  9.709999  BUFFALO/ROCHESTER    NA  539  1219  Chain87 
    

    不管我想要什么 IRI_KEY , OU , EST_ACV 等作为列名。

    我正在尝试使用 因为我将删除第一行并删除 V5 NA 列。

    我会提供数据,但数据使用的因素和规模太大,所以。我提供 head() 在前5个结果中。

           V1  V2        V3                    V4 V5   V6    V7        V8
    1 IRI_KEY  OU  EST_ACV   Market_Name          NA Open  Clsd  MskdName
    2  200039  GR  9.709999  BUFFALO/ROCHESTER    NA  539  1219  Chain87 
    3  200171  GR  27.69099  MILWAUKEE            NA  522  9998  Chain97 
    4  200197  GR     11.14  PEORIA/SPRINGFLD.    NA  903  9998  Chain59 
    5  200233  GR  7.514999  OKLAHOMA CITY        NA 1122  1150  Chain102
    

    dput() 在这里

    https://textuploader.com/dn5vb

    1 回复  |  直到 6 年前
        1
  •  2
  •   markus    6 年前

    你可以试试

    library(purrr)
    library(dplyr)
    names <- sapply(df[1, setdiff(names(df), "V5")], as.character)
    df %>% 
      select(-V5) %>% 
      set_names(., nm = names) %>%
      .[-1, ]
    #  IRI_KEY OU  EST_ACV       Market_Name Open Clsd MskdName
    #2  200039 GR 9.709999 BUFFALO/ROCHESTER  539 1219  Chain87
    #3  200171 GR 27.69099         MILWAUKEE  522 9998  Chain97
    #4  200197 GR    11.14 PEORIA/SPRINGFLD.  903 9998  Chain59
    #5  200233 GR 7.514999    OKLAHOMA CITY  1122 1150 Chain102
    

    提取除列以外的第一行 V5 并转换为字符。在“管道第一排除”列中 ,然后更改列名并删除第一行。

    数据

    df <- read.table(text = "       V1  V2        V3                    V4 V5   V6    V7        V8
    IRI_KEY  OU  EST_ACV   Market_Name          NA Open  Clsd  MskdName
    200039  GR  9.709999  BUFFALO/ROCHESTER    NA  539  1219  Chain87 
    200171  GR  27.69099  MILWAUKEE            NA  522  9998  Chain97 
    200197  GR     11.14  PEORIA/SPRINGFLD.    NA  903  9998  Chain59 
    200233  GR  7.514999  'OKLAHOMA CITY'       NA 1122  1150  Chain102", header = TRUE)