2015-04-08 11 views
55

Mam ramki danych tak:Konwersja nazwy wierszy w pierwszej kolumnie

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 w pierwszej kolumnie. Obecnie używam czegoś podobnego do tworzenia nazw wierszy jako pierwszej kolumny:

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

Czy istnieje jedna linia, aby to zrobić?

+0

możliwe duplikat [R: przekształcaniu nazwy rzędu wielu ramek danych w kolumnie w ramce danych] (http://stackoverflow.com/questions/18403199/r-converting-row-names-in-multiple- klatki danych do kolumny w ramce danych) – rmuc8

+0

Nie potrzebujesz dodatkowych pakietów, tutaj jest jedna linijka: 'd <- cind (rownames (d), data.frame (d, row.names = NULL)) ' – ssp3nc3r

Odpowiedz

51

Można oba nazwy usuń wiersz i konwertować je do kolumny przez odniesienie (bez realokacji pamięci przy użyciu ->) używając setDT i jego keep.rownames = TRUE argumentu z pakietu 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 
+3

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

+3

@Swetabh Cóż, nie. 'setnames (df, 1," newname ")' jest sposobem 'data.table'. –

57

Albo można użyć dplyr 's add_rownames, który robi to samo, co odpowiedź Davida:

library(dplyr) 
df <- add_rownames(df, "VALUE") 

UPDATE (połowa 2016):

add_rownames() została zaniechana i jest zastępowany przez tibble::rownames_to_column() (same funkcje, ale Hadley refactored dplyr nieco).

+11

Nie * dokładnie * to samo, ponieważ nie robi tego * przez odniesienie * :) –

36

Opcja jedna linia:

df$names <- rownames(df) 
+3

Mam nadzieję, że zdajesz sobie sprawę z tego, że dodaje on 'rownames' jako kolumnę na końcu, a nie jako pierwszą kolumnę. –

+0

Dobra uwaga. A więc nie taki jeden liniowiec. :) – Emily

+2

Czym się różni od tego, co OP już wypróbował? Oni już wiedzieli o 'rownames', nie? Chcieli jednak umieścić ją na początku. –

3

Alternatywnie, można utworzyć nowy dataframe (lub zastąpić dotychczasowy jeden, jak na poniższym przykładzie), dzięki czemu nie trzeba używać jakiegokolwiek opakowania zewnętrznego. Jednak ta metoda może nie być wydajna w przypadku ogromnych ramek danych.

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

Lub: 'df <- cbind (names = rownames (df), df)' –

Powiązane problemy