Satır adlarını ilk sütuna dönüştür


147

Ben böyle bir veri çerçevesi var:

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" 

Satır adlarını ilk sütuna dönüştürmek istiyorum. Şu anda ilk sütun olarak satır adları yapmak için böyle bir şey kullanın:

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

Bunu yapmak için tek bir satır var mı?



12
Ekstra paketlere ihtiyacınız yok, işte bir astar:d <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r

@ Ssp3nc3r tarafından yapılan yorum kabul edilmiş bir cevap olmalıdır
Hrant

Yanıtlar:


119

Yapabilirsin hem kaldır satır adları ve bir sütuna dönüştürmek referans olarak (kullanarak Bellek yeniden olmadan ->kullanarak) setDTve keep.rownames = TRUEgelen argüman data.tablepaketinden

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 tarafından belirtildiği gibi, yeni sütuna istediğiniz adı verebilirsiniz, örneğin setDT(df, keep.rownames = "newname")satır sütunu olarak "newname" ekler.


5
Gerekirse colnames(df)[1] <- "newname"ilk sütunu yeniden adlandırmak için kullanın .
Swetabh

5
@Swetabh Şey, hayır. setnames(df, 1, "newname")olduğu data.tableşekilde.
David Arenburg

@DavidArenburg Peki, (en azından) şimdi aynı çağrıda yapabilirsinizsetDT(df, keep.rownames = "newname")[]
sindri_baldur

1
@DavidArenburg şu belgelerde bulundu as.data.table(): TRUE ise, giriş nesnesinin adlarını "rn" adlı ayrı bir sütun olarak ekler. keep.rownames = "id", bunun yerine "id" sütununu adlandırır
sindri_baldur

1
@snoram iyi bul, dokümanlar tutarlı hale getirmek için bir PR yapacağım.
David Arenburg

140

Yoksa kullanabilirsiniz dplyr's add_rownamesDavid'in cevap olarak aynı şeyi yapar:

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

GÜNCELLEME (2016 ortası): (yukarıdakilere dahil)

çağrılan eski işlev add_rownames()kullanımdan kaldırılmıştır ve onun yerini almıştır tibble::rownames_to_column()(aynı işlevler, ancak Hadley dplyrbiraz yeniden düzenlenmiştir ).


14
Tam olarak aynı değil , çünkü referans ile yapmıyor :)
David Arenburg

1
GÜNCELLEME: dplyr güncellemesi için dplyr :: rownames kullanımdan kaldırıldığı için tibble :: rownames_to_column () kullanılmasını gerektirir.
EDennnis

Bir tidyverse içinde kalmak istiyorsa harika
Euler_Salter

83

Bir satır seçeneği:

df$names <- rownames(df)

12
Umarım rownamesen sonunda bir sütun olarak eklenmiş olduğunun farkındasınızdır , aslında ilk sütun olarak değil.
Agaz Hussain

30

Alternatif olarak, herhangi bir harici paket kullanmanıza gerek kalmaması için yeni bir veri çerçevesi oluşturabilir (veya aşağıdaki örnekte geçerli olanın üzerine yazabilirsiniz). Ancak bu şekilde devasa veri çerçeveleri için verimli olmayabilir.

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

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

15

Yorumumu yukarıdaki öneri başına bir cevaba taşıdı:

Ekstra paketlere ihtiyacınız yok, işte bir astar:

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

4

dplyr::as_data_frame(df, rownames = "your_row_name") size daha basit bir sonuç verecektir.


2
@HectorHaffenden bunu poster için düzenledi, çünkü aslında güzel bir öneri.
Tjebo

2

Veya DBIs kullanaraksqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.