किसी डेटा फ़्रेम का कॉलम नाम बदलना


399

मेरे पास "newprice" नामक एक डेटा फ़्रेम है (नीचे देखें) और मैं आर में अपने कार्यक्रम में कॉलम के नाम बदलना चाहता हूं।

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

वास्तव में यह वही है जो कर रहा है:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

मैंने इसे एक लूप में नहीं रखा है क्योंकि मैं चाहता हूं कि प्रत्येक कॉलम का नाम आपके अनुसार अलग हो।

जब मैं अपने प्रोग्राम को R कंसोल में पेस्ट करता हूं तो यह आउटपुट है जो मुझे देता है:

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

मैंने समान रूप से c()फ़ंक्शन के लिए उदाहरण c("premium")के बजाय फ़ंक्शन का उपयोग करने की कोशिश की paste()है, लेकिन कोई फायदा नहीं हुआ।

किसी ने मुझे यह पता लगाने में मदद कर सकता है?


यदि डिर्क का उत्तर काम करता है तो समस्या यह थी कि आप डेटाफ़्रेम के बजाय मैट्रिक्स के साथ काम कर रहे थे। आप इसे is.matrixया तो के साथ देख सकते हैं str
IRTFM

3
इस उत्तर को dplyr पर देखें :: rename stackoverflow.com/a/26146202/1831980
लार्सन

8
colnames(newprice)<- c("premium","change","newprice")
तुंग गुयेन

आपकी त्रुटि का आपके कोड की गुणवत्ता से कोई लेना-देना नहीं है। आप गलत प्रतीक का उपयोग कर रहे हैं। यह "आर द्वारा मान्यता प्राप्त नहीं है, इसके बजाय" का उपयोग करें। मुझे पता है कि वे समान दिख सकते हैं। करीब से देखें: ""। बस।
ईदो

जवाबों:


592

colnames()फ़ंक्शन का उपयोग करें :

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

आप भी सब्मिट कर सकते हैं:

R> colnames(X)[2] <- "superduper"

12
@Dirk () के बजाय नाम () का उपयोग क्यों नहीं किया जाता है?
एंटोनी लिज़ी

4
महान! आप एक ही बार में कई कॉलमों को सब्मिट कर सकते हैं (बड़े डेटा फ्रेम पर उपयोगी)। colnames(X)[c(1,2)] <- c("good", "better")
मेटाक्रिटिट

7
पैकेज setnames()में प्रयास करें data.table। कुछ का उपयोग करें setnames(DT,"b","B")याsetnames(DT,c("a","E"),c("A","F"))
dwstu

अजीब तरह से, डेटा फ़्रेम के कॉलम नामों को सेट करने के बाद, त्रुटि में परिणाम (जहां एक नया नाम कॉलम को दिया गया है) के रूप में q1उपयोग करके डेटा फ़्रेम को म्यूट करने की कोशिश की जा रही है । यह वास्तव में निराशाजनक है। dplyrq1 <- q1 %>% mutate(rel_count = count / 482462)Error in mutate_impl(.data, dots) : unknown column 'days'days
डेविड टोनहोफर 21

176

मैं इसका उपयोग करता हूं:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"

7
धन्यवाद। मुझे लगता है कि यह किसी तरह से आर से परेशान है: स्तंभ नाम को बदलना इतना मुश्किल क्यों है यदि आप सूचकांक संख्या का उपयोग नहीं करना चाहते हैं लेकिन पुराना नाम :(
Arne

10
इस पद्धति का लाभ यह है कि आपको कॉलम की स्थिति के बारे में चिंता करने की ज़रूरत नहीं है, जब तक कि आप इसका मूल नाम नहीं जानते हैं। मुझे लगता है कि यह पसंदीदा तरीका है जैसा कि आप - बाद में - उस कोड में बदलाव कर सकते हैं जो उस कॉलम की स्थिति को बदल देता है जिसे आप नाम बदलना चाहते हैं।
पाउलो एस अब्रेउ

78

त्रुटि "स्मार्ट-कोट्स" (या वे जो भी कहते हैं) के कारण होती है। यहाँ सबक है, "अपने कोड को एक 'संपादक' में न लिखें जो उद्धरण को स्मार्ट-कोट्स में परिवर्तित करता है"।

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

इसके अलावा, आपको ज़रूरत नहीं है paste("premium")(कॉल pasteनिरर्थक है) और <-भ्रम (जैसे x <- -10; if(x<-3) "hi" else "bye"; x) से बचने के लिए रिक्त स्थान डालना एक अच्छा विचार है ।



42

ऐसा करने के लिए नया अनुशंसित तरीका setNamesफ़ंक्शन का उपयोग करना है। देख लो ?setNames। चूंकि यह एक नई प्रति बनाता है , इसलिए यदि आपका इरादा है, तो data.frameमूल परिणाम को निर्दिष्ट करना सुनिश्चित करें data.frame

data_frame <- setNames(data_frame, c("premium","change","newprice"))

यदि आप colnamesपहले दिए गए उत्तर द्वारा सुझाए गए कुछ तरीकों से उपयोग करते हैं , तो आर के नए संस्करण आपको चेतावनी देंगे ।

यदि यह data.tableइसके बजाय थे , तो आप data.tableफ़ंक्शन का उपयोग कर सकते हैं setnames, जो विशिष्ट कॉलम नामों या संदर्भ द्वारा एकल कॉलम नाम को संशोधित कर सकता है :

setnames(data_table, "old-name", "new-name")

2
लगता है कि यह data.frame के लिए कहा गया था, न कि data.table
Helix123

35

मेरे पास एक ही मुद्दा था और कोड के इस टुकड़े ने मेरे लिए काम किया।

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

संक्षेप में, यह कोड निम्न कार्य करता है:

names(data)डेटाफ़्रेम ( data) में सभी नामों को देखता है

[names(data) == oldVariableName]उस चर नाम ( oldVariableName) को निकालता है जिसे आप <- "newVariableName"नया नाम देना चाहते हैं और नया चर नाम निर्दिष्ट करते हैं।


यदि आपके पास 3 पुरानेVariableNames जैसे वेक्टर हैं तो यह कैसे काम करेगा?
जिग्गंजर

वास्तव में मैं क्या देख रहा था -> 2 अंगूठे!
सिलसूर

19

दूसरों के समान:

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols

काफी सरल और संशोधित करने में आसान।



10

यदि आपको एक बार में सभी नहीं बल्कि कई स्तंभों का नाम बदलने की आवश्यकता है जब आप केवल पुराने कॉलम नामों को जानते हैं तो आप colnamesफ़ंक्शन और %in%ऑपरेटर का उपयोग कर सकते हैं । उदाहरण:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

अब आप "खराब" और "सबसे खराब" को "अच्छा" और "सर्वश्रेष्ठ" में बदलना चाहते हैं। आप उपयोग कर सकते हैं

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

इसका परिणाम यह होगा

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C

1
यह कोड आपके कॉलम नामों के क्रम को आवेषण के क्रम के बराबर मानता है
हिलेरी सैंडर्स

10

Colname फ़ंक्शन द्वारा कॉलम नाम बदलने के लिए इसका उपयोग करें।

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

8

आप बस इसके द्वारा संपादन कर सकते हैं:

newprice <- edit(newprice)

और कॉलम नाम को मैन्युअल रूप से बदलें।


क्या यह काम केवल वेक्टर और कारक तत्वों के लिए नहीं है? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
योनि

यह कम से कम डेटा फ्रेम के लिए काम करता है। यही मुझे पता है।
बेकल

7

मेरे कॉलम के नाम नीचे दिए गए हैं

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

मैं क्लास और सेक्स का कॉलम नाम बदलना चाहता हूं

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")

7

के साथ कुछ विकल्प हैं dplyr::rename()और dplyr::select():

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

वहाँ भी की तीन scoped वेरिएंट हैं dplyr::rename(): dplyr::rename_all()सभी कॉलम नामों के लिए, dplyr::rename_if()सशर्त स्तंभ नाम को निशाना बनाने के लिए, और dplyr::rename_at()नामित स्तंभों का चयन करने के लिए। निम्न उदाहरण एक अंडरस्कोर के साथ रिक्त स्थान और अवधि को बदलता है और सब कुछ को निचले मामले में परिवर्तित करता है:

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

dplyr::select_all() एक समान तरीके से भी इस्तेमाल किया जा सकता है:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

6

बस स्कॉट विल्सन जवाब को सही और थोड़ा विस्तारित करने के लिए।
आप data.able के setnamesफ़ंक्शन का उपयोग data.frames पर भी कर सकते हैं ।

ऑपरेशन की गति की अपेक्षा न करें, लेकिन आप setnamesमेमोरी खपत के लिए अधिक कुशल होने की उम्मीद कर सकते हैं क्योंकि यह संदर्भ द्वारा कॉलम नामों को अपडेट करता है। यह addressफ़ंक्शन के साथ ट्रैक किया जा सकता है , नीचे देखें।

library(data.table)
set.seed(123)
n = 1e8

df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(df)
#[1] "0x208f9f00"
colnames(df) <- c("good", "better")
address(df)
#[1] "0x208fa1d8"
rm(df)

dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(dt)
#[1] "0x535c830"
setnames(dt, c("good", "better"))
address(dt)
#[1] "0x535c830"
rm(dt)

इसलिए यदि आप अपनी मेमोरी लिमिट को टटोल रहे हैं तो आप इसके बजाय इसका उपयोग करने पर विचार कर सकते हैं।


3

यह मददगार हो सकता है:

rename.columns=function(df,changelist){
  #renames columns of a dataframe
  for(i in 1:length(names(df))){
    if(length(changelist[[names(df)[i]]])>0){
      names(df)[i]= changelist[[names(df)[i]]]
    }
  }
  df
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))

1

मामले में हमारे पास 2 डेटाफ्रेम निम्नलिखित कार्य हैं

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

हम निम्नानुसार DF1 के नाम बदलते हैं

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