【问题标题】:how to change col names with the first row of a data in dplyr chain如何使用 dplyr 链中数据的第一行更改列名
【发布时间】:2018-11-09 16:07:46
【问题描述】:

我尝试用数据的第一行重命名列名。

use first row data as column names in r

use %>% with replacement functions like colnames()<-

我反驳的问题是,在不破坏dplyr pipeline 的情况下执行此过程,因为我想在重命名列后继续做一些其他事情。

这篇文章中有关于rename函数的评论 dplyr::rename 如果您只是(重新)命名许多列中的几个(它需要同时编写旧名称和新名称;请参阅@Richard Scriven 的回答),则 dplyr::rename 可能会更方便

但是,在我的真实数据中,列数不是固定的,所以我需要使用类似选择列select(X9:max(ncol(.)))

df <- data.frame(replicate(10,sample(100,2,rep=TRUE)))


  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1 77 40 45 98 75 17  5 33 53  94
2 43 67 82 42 63 90 14 65  4  98

library(dplyr)
df1 <- df %>%
  select(X8,X9,X10)%>%
  ....

选择和重命名列后的预期输出

  33 53  94
1 65  4  98

【问题讨论】:

  • df %&gt;% setNames(as.character(df[1,]))
  • 所以澄清一下,您只想保留一些列(X9:end),并从第一行获取名称?
  • @Ryan 完美。是否可以删除 setNames 之后的第一行?因为输出权知道仍然保持第一行。
  • @CalumYou 没错!
  • @Ryan 还有一件事如何在select df1 &lt;- df %&gt;% select(X8,X9,X10)%&gt;% setNames(as.character(.[1,X9:max(ncol(.))])) 之后仅重命名选定的列

标签: r dplyr


【解决方案1】:
set.seed(502)
df <- data.frame(replicate(10, sample(100, 2, rep=TRUE)))

> df
  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1 79  6 82 23 36 58 95 30 60  42
2 89 77  9 13 79 97  1 10 48  66

在基础 R 中我们可以做到

df1 <- "colnames<-"(df[2 , x <- paste0("X", 8:10)], df[1, x])

> df1
  30 60 42
2 10 48 66

【讨论】:

    【解决方案2】:

    您可以通过将列命名为第一行然后删除第一行来轻松做到这一点。

    library(dplyr)
    df <- df %>%
      select(X8,X9,X10)
    
    names(df) <- df[1,]
    df <- df[-1,]
    
    

    【讨论】:

      【解决方案3】:

      你可以这样做

      library(tidyverse)
      df <- data.frame(replicate(10,sample(100,2,rep=TRUE)))
      df
      #>   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
      #> 1 22 64 23 11 36 46 87 57 90  96
      #> 2 62 46 15  9 77 84 70 32 71   8
      
      cols_2_select <- c('X8','X9','X10')
      
      df %>%
        select(all_of(cols_2_select)) %>% 
        set_names(df %>% select(all_of(cols_2_select)) %>% slice(1) %>% as.character()) %>% 
        slice(-1)
      #>   57 90 96
      #> 1 32 71  8
      

      reprex package (v1.0.0) 于 2021-04-16 创建

      【讨论】:

        【解决方案4】:

        因为我在这里没有看到这个,它似乎比其他选项更简单/更整洁:set_names(slice(.,1))(以第一行命名;不需要对字符进行显式强制),然后是 @987654322 @(丢弃第一行,因为您不再需要它)...

        library(tidyverse)
        df1 <- (df 
            %>% select(X8:X10) 
            %>% set_names(slice(.,1)) 
            %>% slice(-1)
        )
        

        set_names 取自@cropgen 的回答)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-07
          • 1970-01-01
          • 2020-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-22
          相关资源
          最近更新 更多