पहले कॉलम में पंक्ति नाम परिवर्तित करें


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

आप दोनों पैकेज नामों को हटा सकते हैं और पैकेज से उनके तर्क का उपयोग करके संदर्भ (बिना मेमोरी का उपयोग किए बिना ->) को एक कॉलम में परिवर्तित कर सकते हैंsetDTkeep.rownames = TRUEdata.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"पहले कॉलम नाम बदलने के लिए यदि आवश्यक हो तो।
स्वेताभ

5
@ श्वेताभ खैर, नहीं। setnames(df, 1, "newname")है data.tableजिस तरह से।
डेविड अर्नबर्ग

@DavidArenburg खैर, (कम से कम) अब आप इसे एक ही कॉल में कर सकते हैंsetDT(df, keep.rownames = "newname")[]
sindri_baldur

1
@DavidArenburg के लिए प्रलेखन में पाया गया as.data.table(): यदि TRUE, "rn" नामक एक अलग कॉलम के रूप में इनपुट ऑब्जेक्ट के नाम जोड़ता है। Keep.rownames = "id" कॉलम को "id" नाम देता है
sindri_baldur

1
@snoram अच्छा लगता है, मैं डॉक्स को सुसंगत बनाने के संबंध में एक पीआर बनाऊंगा।
डेविड ऐरनबर्ग

140

या आप उपयोग कर सकते हैं dplyrs ' add_rownamesजो डेविड के जवाब के रूप में एक ही बात करता है:

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

अद्यतन (2016 के मध्य): (ऊपर शामिल)

पुराने फ़ंक्शन add_rownames()को पदावनत कर दिया गया है और इसे tibble::rownames_to_column()उसी कार्य द्वारा प्रतिस्थापित किया जा रहा है (लेकिन हैडली ने dplyrथोड़ा रिफैक्ट किया)।


14
नहीं बिल्कुल एक ही है, क्योंकि यह नहीं है कि यह कर रहा है संदर्भ द्वारा :)
डेविड Arenburg

1
अद्यतन: dplyr अद्यतन के लिए tibble का उपयोग करने के लिए एक की आवश्यकता है: rownames_to_column () चूंकि dplyr :: rownames को पदावनत किया जाता है।
ईडेनिस

यह बहुत अच्छा है अगर कोई tidyverse के भीतर रहना चाहता है
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 ने पोस्टर के लिए इसे संपादित किया है, क्योंकि यह वास्तव में एक अच्छा सुझाव है।
Tjebo

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.