如何使用dplyr链中的第一行数据更改列名称

时间:2018-05-30 17:56:12

标签: r dplyr

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

use first row data as column names in r

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

我反驳的问题是在不破坏dplyr pipeline的情况下执行此过程,因为我希望在重命名列后继续执行其他操作。

此帖中有关于rename功能的评论 dplyr :: rename可能更方便,如果你只是(重新)命名很多列中的一些(它需要写旧名和新名;请参阅@Richard Scriven的回答)

但是,在我的实际数据中,列数不固定,所以我需要使用类似的选择列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

4 个答案:

答案 0 :(得分:1)

你可以这样做

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 年 4 月 16 日创建

答案 1 :(得分:0)

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 :(得分:0)

您可以通过将列命名为第一行然后删除第一行来轻松完成此操作。

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

names(df) <- df[1,]
df <- df[-1,]

答案 3 :(得分:0)

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

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

set_names 取自 @cropgen 的回答)