行名を最初の列に変換する


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

@ ssp3nc3rのコメントは承認された回答である必要があります
Hrant

回答:


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方法。
デビッドアレンブルク2016年

@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

それとも、使用することができるdplyradd_rownamesデビッドの答えと同じことを行います。

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

更新(2016年半ば):(上記に組み込まれています)

呼び出された古い関数add_rownames()は廃止され、置き換えられていますtibble::rownames_to_column()(同じ関数ですが、Hadley dplyrが少しリファクタリングされました)。


14
ない正確に同じ、それはそれをやっていないので、参照することにより :)
デビッドArenburg

1
更新:dplyr :: rownamesは非推奨であるため、dplyrの更新では、tibble :: rownames_to_column()を使用する必要があります。
EDennnis

これは、tidyverse内にとどまりたい場合に最適です
Euler_Salter

83

1行のオプションは次のとおりです。

df$names <- rownames(df)

12
rownames最初の列としてではなく、最後に列として追加されることをご理解いただければ幸いです。
Agaz Hussain 2016

30

別の方法として、新しいデータフレームを作成する(または、以下の例のように現在のデータフレームを上書きする)ことができるので、外部パッケージを使用する必要はありません。ただし、この方法は巨大なデータフレームでは効率的でない場合があります。

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

10
または:df <- cbind(names = rownames(df), df)
Mark Miller

15

私のコメントを上記の提案ごとの回答に移動しました:

追加のパッケージは必要ありません。ここにワンライナーがあります:

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

4

dplyr::as_data_frame(df, rownames = "your_row_name") より簡単な結果が得られます。


2
@HectorHaffendenはポスターのためにこれを編集しました。
Tjebo

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.