डेटा.फ्रेम में किसी एकल कॉलम का नाम कैसे बदला जाए?


335

मुझे पता है कि अगर मेरे पास 1 कॉलम से अधिक डेटा फ्रेम है, तो मैं उपयोग कर सकता हूं

colnames(x) <- c("col1","col2")

स्तंभों का नाम बदलने के लिए। यदि यह सिर्फ एक कॉलम है तो मैं इसे कैसे करूँ? मतलब एक वेक्टर या डेटा फ्रेम जिसमें केवल एक कॉलम होता है।

उदाहरण:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]

4
@ ऐक्स का समाधान 1-कॉलम डेटा.फ्रेम के लिए काम करेगा। आप शायद drop=TRUEडिफ़ॉल्ट तर्क से भ्रमित हो रहे हैं [, जो "1-कॉलम" ऑब्जेक्ट को वेक्टर में परिवर्तित करने का कारण बनता है ... और वैक्टर नहीं है colnames। आपने जो प्रयास किया उसका एक उदाहरण बहुत मददगार होगा।
जोशुआ उलरिच

2
यह काम करता है अगर आप "colnames (x) [1] <- 'newname2'" का उपयोग करते हैं
screechOwl

जवाबों:


344
colnames(trSamp)[2] <- "newname2"

दूसरे कॉलम का नाम सेट करने का प्रयास। आपकी ऑब्जेक्ट में केवल एक कॉलम है, इसलिए कमांड एक त्रुटि फेंकता है। यह पर्याप्त होना चाहिए:

colnames(trSamp) <- "newname2"

1
। @ यहोशूविक्रिच - यह काम करने के लिए प्रतीत नहीं होता है यदि स्तंभ नाम कुछ ऐसा है "A,B,C,X,Y,Z"जहां मैं इसका Yउपयोग करने के लिए नाम बदलना चाहता हूं testData[379] <- "Y"
चेतन अरविंद पाटिल

576

यह एक सामान्यीकृत तरीका है जिसमें आपको चर का सही स्थान याद नहीं रखना है:

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'

यह कोड बहुत निम्नलिखित करता है:

  1. names(df) में सभी नामों में दिखता है df
  2. [names(df) == old.var.name] वह चर नाम निकालता है जिसे आप जाँचना चाहते हैं
  3. <- 'new.var.name' नया चर नाम प्रदान करता है।

5
मैं भी आर के साथ काफी नया हूँ, इस समाधान को प्यार करता था! मैंने वास्तव में जाँच की है कि यह क्या करता है, और मुझे लगता है कि यह निर्दिष्ट करने योग्य है कि [names(df) == old.var.name]वास्तव में एक वेक्टर सच / झूठे मूल्यों के साथ लौटता है। इसलिए इसमें कई कॉलम नामों को बदलने की क्षमता है, उदाहरण के लिए, नियमित अभिव्यक्ति का उपयोग किया जाता है।
मिक्यटोप

3
नियमित अभिव्यक्ति के परिणाम के लिए, जैसे कुछ का उपयोग करें names(df) = sub('pattern', 'replacement', names(df))। अन्यथा आप एक ही नाम पर कई कॉलम सेट करने का प्रयास करेंगे।
वी आर ऑल मोनिका

40
मिश्रित भावनाएं ... एक आदर्श दुनिया में, जहां सही प्रोग्रामिंग भाषाएं लाजिमी हैं, क्या वास्तव में एकल कॉलम का नाम बदलने के लिए इस कई कीस्ट्रोक्स की आवश्यकता होगी? मैं आर से प्यार करता हूं लेकिन कभी-कभी मैं इस प्रकार के कारणों के लिए इसे गला देना चाहता हूं।
tumultous_rooster

4
आधार में इसके लिए रैपर फ़ंक्शन कैसे नहीं है?
ifly6

1
हम सब कैसे चाहते हैं! मैं अब के बारे में नहीं जानता, लेकिन फिर भी आधार में कोई आवरण नहीं था
साइड_0__प्राप्त

85
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

2
मुझे यह समाधान पसंद है क्योंकि आप नाम से कॉलम नाम को संदर्भित कर सकते हैं, यह जानने के लिए आवश्यक है कि यह कौन सा नंबर कॉलम है। बड़ी संख्या सुविधाओं के लिए बेहतर है।
साइबरनेटिक

1
मुझे प्रश्न और इस उत्तर के लिए एक छोटा सा विस्तार मिला है। मेरे पास एक कॉलम के साथ एक डेटाफ्रेम है जिसमें अक्षर 'एसएनपी' है। मैं इसका नाम बदलकर 'मार्कर' रखना चाहता हूं । लेकिन मैं ऐसा करने के लिए एक नियमित अभिव्यक्ति का उपयोग करना चाहता हूं । जाहिरा तौर पर मेरे पास कोड त्रुटिपूर्ण है: colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"क्योंकि कॉलम का नाम नहीं है। अगर मैं ऐसा करूँ names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"तो इसका नाम बदल दिया गया है। मैं क्या खो रहा हूँ?
Sander W. van der Laan

76

यह एक पुराना प्रश्न है, लेकिन यह ध्यान देने योग्य है कि अब आप पैकेज setnamesसे उपयोग कर सकते हैं data.table

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)

6
या setNamesबेस आर से
पैट्रिक टी

53

यह हैडली plyrपैकेज और renameफ़ंक्शन का उपयोग करके भी किया जा सकता है ।

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))

आप नाम (स्थिति को जाने बिना) का नाम बदल सकते हैं और एक ही बार में कई नाम रख सकते हैं। मर्ज करने के बाद, उदाहरण के लिए, आप के साथ समाप्त हो सकता है:

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13

तब आप एक चरण का उपयोग करके नाम बदल सकते हैं:

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13

7
renameअब dplyrपैकेज में भी एक समारोह है ।
सैम फिरके

36

मुझे लगता है कि स्तंभों का नाम बदलने का सबसे अच्छा तरीका इस तरह के dplyr पैकेज का उपयोग करना है :

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

यह किसी भी डेटासेट में एक या कई कॉलम का नाम बदलने के लिए समान काम करता है।


12

मुझे एक बार फिर से नाम बदलने के लिए अगली शैली पसंद है।

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

कहाँ पे

which(colnames(df) == 'old_colname')

विशिष्ट कॉलम के सूचकांक द्वारा रिटर्न।


1
+1 उपयोगकर्ता को वास्तविक पुराने नाम का उपयोग करने का मौका देने के लिए :)

1
यहाँ @zongshiwujie समाधान की तुलना में क्या अंतर है?
buhtz

which()इसकी आवश्यकता नही है।
sindri_baldur

12

मुझे पता है कि किसी एकल स्तंभ का नाम बदलने का सबसे सुविधाजनक तरीका उपयोग कर रहा है dplyr::rename_at:

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
  • पाइप चेन में अच्छी तरह से काम करता है
  • सुविधाजनक जब नाम चर में रखे जाते हैं
  • एक नाम या एक कॉलम इंडेक्स के साथ काम करता है
  • स्पष्ट और कॉम्पैक्ट

6

आप पैकेज rename.varsमें उपयोग कर सकते हैं gdata

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")

यह विशेष रूप से उपयोगी है जहां आपके पास परिवर्तन करने के लिए एक से अधिक चर नाम हैं या आप चर नामों के लिए कुछ पाठ को जोड़ना या प्री-पेंड करना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))

चर नाम के एक सबसेट पर पाठ जोड़ने के उदाहरण के लिए देखें: https://stackoverflow.com/a/28870000/580802


यह सबसे आसान है, धन्यवाद। Dplyr पैकेज के साथ समस्या थी।
डैनीबी

4

प्रयत्न:

colnames(x)[2] <- 'newname2'

8
यह वही त्रुटि है जिसे ओपी ने अपने संपादन में () के बारे में पूछा था। यह काम नहीं करेगा, क्योंकि डेटाफ्रेम में केवल एक कॉलम होता है।

। @ एनपीई - यह काम करने के लिए प्रतीत नहीं होता है यदि कॉलम नाम कुछ ऐसा है "A,B,C,X,Y,Z"जहां मैं इसका Yउपयोग करने के लिए नाम बदलना चाहता हूं testData[379] <- "Y"
चेतन अरविंद पाटिल

4

यह पहले से ही बाहर होने की संभावना है, लेकिन मैं एक समाधान की खोज करते हुए खेतों का नाम बदलने के साथ खेल रहा था और यह कोशिश की। मेरे उद्देश्यों के लिए काम किया।

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL

यहां से शुरू होता है संपादन…।

यह भी काम करता है।

df <- rename(df, c("oldColName" = "newColName"))

जिस किसी ने मुझे नीचे चिह्नित किया, वह ठीक है, लेकिन चूंकि मैं स्पष्ट रूप से ऐसा करने के लिए नया हूं, शायद आप यह बता सकते हैं कि उत्तर में क्या गलत था।
स्कॉटी

आपके उत्तर में कुछ भी गलत नहीं है, इसके अलावा यह एक oneliner नहीं है .. जो कि सिर्फ एक शत्रुतापूर्ण SO उपयोगकर्ता था जो अपने तंत्र को सही ठहराने का साहस नहीं कर रहा था।
गिनती 0

धन्यवाद @ गिनती ०। यह वास्तव में कुछ माने बिंदु या जो कुछ भी एक प्रश्न पर टिप्पणी करने के लिए सार्थक है, कुछ ऐसा है जो मैं अभी तक करने में सक्षम हूं। कुछ मामलों में प्रश्नों का पालन करना अच्छा होगा क्योंकि मैं एक नया कौशल सीखता हूं। फिर। स्व।
स्कॉटी

1
हमें इसका उपयोग करने के लिए सभी कॉलम नाम देने की आवश्यकता है।
अर्पित सिसोदिया

renameसमारोह किस पैकेज से आता है?
डिएगो

3

यदि आप जानते हैं कि आपके डेटाफ़्रेम में केवल एक कॉलम है, तो आप इसका उपयोग कर सकते हैं: names(trSamp) <- "newname2"


3

आप 'Hmisc' पैकेज से 'upData' भी आज़मा सकते हैं।

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))


बहुत अच्छा! एक बार में अधिक कॉलम का नाम बदलना भी संभव है: trSamp = upData (trSamp, rename = c (sample.trainer.index..10000। = 'Newname2, AnotherColumnName =' Rename.hisColumn '))
FraNut

0

ओपी का सवाल ठीक है और सही मायने में जवाब दिया गया है। हालाँकि, यहां एक चाल है जो कुछ स्थितियों में उपयोगी हो सकती है: स्तंभ नाम का आंशिक मिलान, एक डेटाफ़्रेम में अपनी स्थिति के बावजूद:

नाम पर आंशिक मिलान:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

एक अन्य उदाहरण: "विराम चिह्न" की उपस्थिति पर आंशिक मिलान:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("[[:punct:]]", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

ये ऐसे उदाहरण थे जिनसे मुझे आज निपटना था, मुझे लगा कि यह साझा करने लायक हो सकता है।


0

मुझे colnames()तर्क आसान लगा https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/row%2Bcolnames

डेटा फ्रेम से कुछ कॉलम चुनें

df <- data.frame(df[, c( "hhid","b1005", "b1012_imp", "b3004a")])

और क्रम में चयनित कॉलम का नाम बदलें,

colnames(df) <- c("hhid", "income", "cost", "credit")

सुनिश्चित करने के लिए नामों और मूल्यों की जाँच करें

names(df);head(df)

0

हम rename_withएक फ़ंक्शन ( stringrउदाहरण के लिए) के साथ कॉलम का नाम बदलने के लिए उपयोग कर सकते हैं ।

निम्नलिखित आंकड़ों पर विचार करें df_1:

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 

नाम बदलें सभी चर के साथ dplyr::everything():

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"

द्वारा नाम बदलें नाम कण से कुछ के साथ dplyrक्रियायें ( starts_with, ends_with, contains, matches, ...)।

.( xचर) के साथ उदाहरण :

df_1 %>% 
  rename_with(.data = ., .cols = contains('.'), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "y"

द्वारा नाम बदलें वर्ग कक्षा की परीक्षा के कई कार्यों के साथ, की तरह is.integer, is.numeric, is.factor...

उदाहरण के साथ is.integer( y):

df_1 %>% 
  rename_with(.data = ., .cols = is.integer, 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "x.1"   "x.2"   "x.3"   "var_1"

चेतावनी:

चेतावनी संदेश: 1: stri_replace_first_regex (स्ट्रिंग, पैटर्न, fix_replacement (प्रतिस्थापन), में: लंबे समय तक ऑब्जेक्ट की लंबाई छोटी वस्तु की लंबाई से अधिक नहीं होती है 2: नामों में [cols] <- .fn (नाम [cols], ...)। : बदलने के लिए मदों की संख्या प्रतिस्थापन लंबाई की एक बहु नहीं है

यह प्रासंगिक नहीं है, क्योंकि यह केवल seq_along(.)प्रतिस्थापित फ़ंक्शन के साथ असंगतता है ।


-1

मैं केवल नाम के साथ डेटा फ्रेम में एक नया कॉलम जोड़ना चाहता हूं और मौजूदा कॉलम से इसके लिए डेटा प्राप्त कर सकता हूं। इस तरह:

dataf$value=dataf$Article1Order

फिर मैं पुराने कॉलम को हटाता हूं! इस तरह:

dataf$Article1Order<-NULL

यह कोड मूर्खतापूर्ण लग सकता है! लेकिन यह पूरी तरह से काम करता है ...


-1

मैं सीधे निम्नलिखित कोड के साथ नए नाम के साथ एक कॉलम नाम को डाटासेट में बदलना चाहता हूं: नाम (डेटासेट) [index_value] <- "new_col_name"


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