Я пытаюсь переименовать имена столбцов в первую строку данных.
использовать данные первой строки как имена столбцов в r
используйте%>% с функциями замены, такими как 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
Итак, чтобы уточнить, вы хотите сохранить только некоторые столбцы (X9:end), а также получить имена из первой строки?
@ Райан Идеально. Можно ли удалить первую строку после setNames? Потому что право вывода все еще сохраняет первую строку.
@CalumYou Это правильно!
@Ryan Еще одна вещь Как я могу переименовать только выбранные столбцы после selectdf1 <- df %>% select(X8,X9,X10)%>% setNames(as.character(.[1,X9:max(ncol(.))]))
Вы можете удалить первую строку с помощью df %>% .[-1,]. Если вы хотите переименовать определенные столбцы, вам, вероятно, понадобится функция rename
@Ryan Я пробовал setNames(2:max(ncol(.)), c(as.character(.[1,]))). но не повезло! Вы имеете в виду setnames внутри rename?
переименовать как в df %>% rename(newname1 = oldname1, newname2 = oldname2,.....)
@ Райан, вот и проблема. Имена моих столбцов в данных не совпадают, и в каждом из них не менее 50 столбцов. В своих реальных данных я пытаюсь загрузить разные файлы и переименовать имена столбцов с первой строкой выбранных столбцов.
@Ryan Почему setNames(as.character(.[1,X9:max(ncol(.))])) не работает? или это setNames(as.character(.[1,2:max(ncol(.))]))





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
Вы можете легко сделать это, назвав столбцы первой строкой, а затем удалив первую строку.
library(dplyr)
df <- df %>%
select(X8,X9,X10)
names(df) <- df[1,]
df <- df[-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
Created on 2021-04-16 by the reprex package (v1.0.0)
Так как я не вижу здесь этого, и он кажется более простым / аккуратным, чем другие варианты: set_names(slice(.,1)) (для обозначения первой строкой; явное принуждение к символу не требуется), за которым следует slice(-1) (для отбрасывания первой строки раз уж он вам больше не нужен) ...
library(tidyverse)
df1 <- (df
%>% select(X8:X10)
%>% set_names(slice(.,1))
%>% slice(-1)
)
(set_names взято из ответа @cropgen)
df %>% setNames(as.character(df[1,]))