Транспонирование кадра данных с сохранением первого столбца в качестве заголовка

У меня большой dataframe, но маленький пример будет таким:

mydf <- data.frame(A = c(letters[1:10]), M1 = c(11:20), M2 = c(31:40), M3 = c(41:50))

Я хочу переставить фрейм данных и сохранить столбец 1 (A) в качестве заголовка столбца (буква [1:10]) в качестве имен переменных. Следующее - пробные испытания неудачных кодов.

tmydf = data.frame(t(mydf))
names(tmydf) <- tmydf[1,]

Спасибо;

5 ответов

Решение

Вот один из способов

tmydf = setNames(data.frame(t(mydf[,-1])), mydf[,1])

Возможно, что-то вроде этого:

tmp <- as.data.frame(t(mydf[,-1]))
> colnames(tmp) <- mydf$A
> tmp
    a  b  c  d  e  f  g  h  i  j
M1 11 12 13 14 15 16 17 18 19 20
M2 31 32 33 34 35 36 37 38 39 40
M3 41 42 43 44 45 46 47 48 49 50

Еще один способ использования janitor::row_to_names() с участием dplyr/ magrittr трубы

      mydf <- data.frame(A = c(letters[1:10]), M1 = c(11:20), M2 = c(31:40), M3 = c(41:50))


library(janitor, warn.conflicts = F)
library(dplyr, warn.conflicts = F)
mydf %>% t %>% as.data.frame() %>% row_to_names(1)

#>     a  b  c  d  e  f  g  h  i  j
#> M1 11 12 13 14 15 16 17 18 19 20
#> M2 31 32 33 34 35 36 37 38 39 40
#> M3 41 42 43 44 45 46 47 48 49 50

Создано 2021-06-17 пакетом REPEX (v2.0.0)

Вы можете использовать функции и из tidyr упаковка.

      library(tidyr)
mydf%>%
  pivot_longer(cols=c(-A),names_to="Original_Vars")%>%
  pivot_wider(names_from=c(A))

Создает столбец с именем "Original_Vars" и новый столбец с именем. Если бы вы остановились здесь, у вас была бы строка для каждой комбинации ваших A переменная, ваши «Original_Vars» (здесь M1, M2 и M3) и значение, связанное с этой парой.

В pivot_wider затем берет все ваши значения из столбца "A" и превращает их в столбцы, используя значения из столбца value столбец, который мы создали с помощью pivot_longer заполнить.

Data.table variante от Ramnath с указанием в строке нужного имени переменной.

mydf <- data.table(A = c(letters[1:10]), M1 = c(11:20), M2 = c(31:40), M3 = c(41:50))
tmydf <- setNames(data.table(t(mydf[,-"A"])), mydf[["A"]])
Другие вопросы по тегам