একটি ডেটা ফ্রেমের কলামের নাম পরিবর্তন করা


399

আমার কাছে "নিউপ্রাইস" নামে একটি ডেটা ফ্রেম রয়েছে (নীচে দেখুন) এবং আমি আর তে আমার প্রোগ্রামে কলামের নামগুলি পরিবর্তন করতে চাই।

> 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") 

আমি এটিকে একটি লুপে রাখিনি কারণ আমি চাই প্রতিটি কলামের নাম আপনি যেমন দেখেন তেমন আলাদা হয়।

আমি যখন আমার প্রোগ্রামটি আর কনসোলে পেস্ট করি তখন এটি আমাকে দেয় আউটপুট:

> 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
আইআরটিএফএম

3
Dplyr উপর এই উত্তরটি :: পুনঃনামকরণ দেখুন stackoverflow.com/a/26146202/1831980
Rasmus লারসেন

8
colnames(newprice)<- c("premium","change","newprice")
টুং নগুইন

আপনার ত্রুটির আপনার কোডের মানের সাথে কোনও সম্পর্ক নেই। আপনি কেবল ভুল প্রতীক ব্যবহার করছেন। এটি "আর দ্বারা স্বীকৃত নয়, পরিবর্তে" ব্যবহার করুন I আমি জানি তারা একইরকম দেখতে পারে close কাছাকাছি দেখুন: ""। এটাই.
এডো

উত্তর:


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
@ ডার্ক কলামনাম () এর পরিবর্তে নাম () ব্যবহার করছেন না কেন?
এন্টোইন লিজি

4
গ্রেট! আপনি একবারে একাধিক কলামও সাবসেট করতে পারেন (বড় ডেটা ফ্রেমের ক্ষেত্রে দরকারী)। colnames(X)[c(1,2)] <- c("good", "better")
metakermit

7
ব্যবহার করে দেখুন setnames()এর মধ্যে data.tableপ্যাকেজ। setnames(DT,"b","B")বা এর মত কিছু ব্যবহার করুনsetnames(DT,c("a","E"),c("A","F"))
ডাবুস্তু

অদ্ভুতভাবে, ডেটা ফ্রেমের কলামের নামগুলি সেট করার পরে, ত্রুটির ফলাফল হিসাবে (যেখানে কলামে একটি নতুন নাম দেওয়া হয়েছে) q1ব্যবহার করে ডেটা ফ্রেমটিকে রূপান্তরিত করার চেষ্টা করা হচ্ছে। এটি সত্যিই হতাশাব্যঞ্জক। dplyrq1 <- q1 %>% mutate(rel_count = count / 482462)Error in mutate_impl(.data, dots) : unknown column 'days'days
ডেভিড টোনহোফার

176

আমি এটি ব্যবহার:

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

7
ধন্যবাদ. আমি মনে করি এটি কোনওভাবে আর এর সাথে বিরক্তিকর: আপনি যদি সূচী নম্বরটি না থেকে তবে পুরাতন নামটি ব্যবহার করতে না চান তবে কলামের নামটি পরিবর্তন করা কেন এত কঠিন :(
আর্ন

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
মনে করুন এটি ডেটা.ফ্রেমের জন্য বলা হয়েছিল, ডেটা নয়।টিবল
হেলিক্স 123

35

আমার একই সমস্যা ছিল এবং কোডের এই টুকরাটি আমার পক্ষে কাজ করেছে।

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

সংক্ষেপে, এই কোডটি নিম্নলিখিতগুলি করে:

names(data)ডেটা ফ্রেমের সমস্ত নাম সন্ধান করে ( data)

[names(data) == oldVariableName]oldVariableNameআপনি নাম পরিবর্তন করতে চান এমন পরিবর্তনশীল নামটি বের <- "newVariableName"করে এবং নতুন ভেরিয়েবলের নাম নির্ধারণ করে।


উদাহরণস্বরূপ 3 টি ওল্ড ভেরিয়েবলনাম সহ ভেক্টর থাকলে কীভাবে এই কাজ করবে?
jiggunjer

ঠিক আমি যা খুঁজছিলাম -> 2 টি থাম্বস আপ !!
সিলসুর


10

চেষ্টা করে দেখুন:

names(newprice) <- c("premium", "change", "newprice")

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

কলনেম ফাংশন দ্বারা কলামের নাম পরিবর্তন করতে এটি ব্যবহার করুন।

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

এছাড়াও তিনটি স্কোপযুক্ত রূপ রয়েছে 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

কেবল স্কট উইলসনের উত্তরটি সংশোধন করতে এবং প্রসারিত করতে।
আপনি ডেটা.ট্রেমের setnamesফাংশন ডেটা.ফ্রেমেও ব্যবহার করতে পারেন ।

অপারেশনের গতি বাড়ানোর আশা করবেন না তবে আপনি 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.