Преобразовать имена строк в первый столбец

147

У меня есть фрейм данных, как это:

df
              VALUE              ABS_CALL DETECTION P-VALUE    
    1007_s_at "957.729231881542" "P"      "0.00486279317241156"
    1053_at   "320.632701283368" "P"      "0.0313356324173416" 
    117_at    "429.842323161046" "P"      "0.0170004527476119" 
    121_at    "2395.7364289242"  "P"      "0.0114473584876183" 
    1255_g_at "116.493632746934" "A"      "0.39799368200131"   
    1294_at   "739.927122116896" "A"      "0.0668649772942343" 

Я хочу преобразовать имена строк в первый столбец. В настоящее время я использую что-то вроде этого, чтобы сделать имена строк в качестве первого столбца:

  d <- df
  names <- rownames(d)
  rownames(d) <- NULL
  data <- cbind(names,d)

Есть ли одна линия для этого?

Агаз Хуссейн
источник
12
Вам не нужны дополнительные пакеты, вот одна d <- cbind(rownames(d), data.frame(d, row.names=NULL))
строка
Комментарий @ ssp3nc3r должен быть принятым ответом
Грант

Ответы:

119

Вы можете удалить как имена строк, так и преобразовать их в столбец по ссылке (без перераспределения памяти ->), используя setDTего keep.rownames = TRUEаргумент из data.tableпакета.

library(data.table)
setDT(df, keep.rownames = TRUE)[]
#    rn     VALUE  ABS_CALL DETECTION     P.VALUE
# 1:  1 1007_s_at  957.7292         P 0.004862793
# 2:  2   1053_at  320.6327         P 0.031335632
# 3:  3    117_at  429.8423         P 0.017000453
# 4:  4    121_at 2395.7364         P 0.011447358
# 5:  5 1255_g_at  116.4936         A 0.397993682
# 6:  6   1294_at  739.9271         A 0.066864977

Как упомянуто @snoram, вы можете дать новому столбцу любое имя, которое хотите, например setDT(df, keep.rownames = "newname"), добавив «newname» в качестве столбца строк.

Дэвид Аренбург
источник
5
Используйте colnames(df)[1] <- "newname"для переименования первого столбца, если это необходимо.
Swetabh
5
@ Swetabh Ну нет. setnames(df, 1, "newname")это data.tableпуть.
Дэвид Аренбург
@DavidArenburg Ну, (по крайней мере) теперь вы можете сделать это одним и тем же вызовомsetDT(df, keep.rownames = "newname")[]
sindri_baldur
1
@DavidArenburg, найденный в документации для as.data.table(): Если TRUE, добавляет имена входных объектов в виде отдельного столбца с именем «rn». keep.rownames = "id" называет столбец "id" вместо этого
sindri_baldur
1
@snoram хорошая находка, я сделаю PR относительно этого, чтобы привести документы в соответствие.
Дэвид Аренбург
140

Или вы можете использовать тот dplyr, add_rownamesкоторый делает то же самое, что и ответ Дэвида:

library(dplyr)
df <- tibble::rownames_to_column(df, "VALUE")

ОБНОВЛЕНИЕ (середина 2016 года): (включено в вышеуказанное)

старая вызванная функция add_rownames()устарела и заменяется на tibble::rownames_to_column()(те же функции, но Хэдли dplyrнемного рефакторинг ).

hrbrmstr
источник
14
Не совсем то же самое, потому что он не делает это по ссылке :)
Дэвид Аренбург
1
ОБНОВЛЕНИЕ: обновление dplyr требует использования tibble :: rownames_to_column (), поскольку dplyr :: rownames устарела.
EDennnis
Это замечательно, если кто-то хочет остаться в пределах тивайверса
Euler_Salter
83

Один вариант строки:

df$names <- rownames(df)
Эмили
источник
12
Я надеюсь, что вы знаете о том, что он добавляется rownamesкак последний столбец, а не как первый столбец.
Агаз Хуссейн
30

Кроме того, вы можете создать новый фрейм данных (или перезаписать текущий, как показано в примере ниже), чтобы вам не нужно было использовать какой-либо внешний пакет. Однако этот способ может быть неэффективным при использовании огромных информационных фреймов.

df <- data.frame(names = row.names(df), df)
drasc
источник
10
Или:df <- cbind(names = rownames(df), df)
Марк Миллер
15

Переместил мой комментарий в ответ по предложению выше:

Вам не нужны дополнительные пакеты, вот одна строка:

d <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r
источник
4

dplyr::as_data_frame(df, rownames = "your_row_name") даст вам еще более простой результат.

Steves
источник
2
@HectorHaffenden отредактировал это для плаката, потому что это действительно хорошее предложение.
Тьебо
2

Или с помощью DBIssqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Агаз Хуссейн
источник