Перетворити назви рядків у перший стовпець


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"), додасте " нове ім'я " як стовпець рядків.


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". hold.rownames = "id" замість цього називає стовпчик "id"
sindri_baldur

1
@snoram добре знайду, я зроблю піар з цього приводу, щоб документи були послідовними.
Девід Аренбург

140

Або ви можете скористатися dplyrфункцією "s", add_rownamesяка робить те саме, що відповідь Давида:

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

ОНОВЛЕННЯ (середина 2016 року): (включено до вище)

стара функція, що називається add_rownames(), була застаріла і її замінюють tibble::rownames_to_column()(ті ж самі функції, але Хедлі dplyrтрохи відновився ).


14
Не зовсім те саме, тому що це не роблять за посиланням :)
Девід Аренбург

1
ОНОВЛЕННЯ: оновлення dplyr вимагає використання tibble :: rownames_to_column (), оскільки dplyr :: імена рядків застаріли.
EDennnis

Це чудово, якщо хтось хоче залишитися в негідності
Euler_Salter

83

Один варіант рядка:

df$names <- rownames(df)

12
Сподіваюся, вам відомо про те, що він додається rownamesяк стовпець у останньому, справді не як перший стовпець.
Агас Хуссейн

30

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

df <- data.frame(names = row.names(df), df)

10
Або:df <- cbind(names = rownames(df), df)
Марк Міллер

15

Я перемістив мій коментар у відповідь на пропозицію вище:

Вам не потрібні додаткові пакети, ось однолінійний:

d <- cbind(rownames(d), data.frame(d, row.names=NULL))

4

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


2
@HectorHaffenden відредагував це для афіші, адже це насправді приємна пропозиція.
Тібо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.