Konwertuj nazwy wierszy na pierwszą kolumnę


147

Mam taką ramkę danych:

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" 

Chcę przekonwertować nazwy wierszy na pierwszą kolumnę. Obecnie używam czegoś takiego, aby nazwy wierszy były pierwszą kolumną:

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

Czy jest do tego jedna linia?



12
Nie potrzebujesz dodatkowych pakietów, oto jedna linijka:d <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r

Komentarz @ ssp3nc3r powinien być zaakceptowaną odpowiedzią
Hrant

Odpowiedzi:


119

Możesz zarówno usunąć nazwy wierszy, jak i przekonwertować je na kolumnę przez odniesienie (bez ponownego przydzielania pamięci za pomocą ->) używając setDTi jego keep.rownames = TRUEargumentu z data.tablepakietu

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

Jak wspomniał @snoram, możesz nadać nowej kolumnie dowolną nazwę, np. setDT(df, keep.rownames = "newname")Dodać „ nową nazwę ” jako kolumnę wierszy.


5
W colnames(df)[1] <- "newname"razie potrzeby użyj, aby zmienić nazwę pierwszej kolumny.
Swetabh

5
@Swetabh Cóż, nie. setnames(df, 1, "newname")jest data.tabledroga.
David Arenburg

@DavidArenburg Cóż, (przynajmniej) teraz możesz to zrobić w tej samej rozmowiesetDT(df, keep.rownames = "newname")[]
sindri_baldur

1
@DavidArenburg znaleziono w dokumentacji dla as.data.table(): Jeśli TRUE, dodaje nazwy obiektów wejściowych jako oddzielną kolumnę o nazwie „rn”. keep.rownames = "id" zamiast tego
nazywa

1
@snoram dobre znalezisko, zrobię PR dotyczący tego, aby dokumenty były spójne.
David Arenburg

140

Lub możesz użyć dplyr, add_rownamesktóre działa tak samo jak odpowiedź Davida:

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

UPDATE (połowa 2016 r.): (Włączona do powyższego)

stara wywołana funkcja add_rownames()została przestarzała i jest zastępowana przez tibble::rownames_to_column()(te same funkcje, ale Hadley dplyrnieco refaktoryzował ).


14
Nie do końca to samo, ponieważ nie robi tego przez odniesienie :)
David Arenburg

1
UPDATE: aktualizacja dplyr wymaga użycia tibble :: rownames_to_column (), ponieważ dplyr :: rownames jest przestarzały.
EDennnis

To jest świetne, jeśli ktoś chce pozostać w porządku
Euler_Salter

83

Jedną linią jest:

df$names <- rownames(df)

12
Mam nadzieję, że zdajesz sobie sprawę z tego, że dodaje się rownamesjako kolumna na końcu, a właściwie nie jako pierwsza kolumna.
Agaz Hussain

30

Alternatywnie możesz utworzyć nową ramkę danych (lub nadpisać obecną, jak w przykładzie poniżej), dzięki czemu nie musisz używać żadnego zewnętrznego pakietu. Jednak ten sposób może nie być wydajny w przypadku dużych ramek danych.

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

10
Lub:df <- cbind(names = rownames(df), df)
Mark Miller

15

Przeniosłem mój komentarz do odpowiedzi na sugestię powyżej:

Nie potrzebujesz dodatkowych paczek, oto jedna linijka:

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

4

dplyr::as_data_frame(df, rownames = "your_row_name") da ci jeszcze prostszy wynik.


2
@HectorHaffenden zmodyfikował to na potrzeby plakatu, ponieważ jest to w rzeczywistości fajna sugestia.
Tjebo

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.