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


335

আমি জানি যদি আমার 1 টিরও বেশি কলাম সহ ডেটা ফ্রেম থাকে তবে আমি ব্যবহার করতে পারি

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

কলামগুলির নাম পরিবর্তন করতে। এটি যদি কেবল একটি কলামে হয় তবে কীভাবে করব? এর অর্থ কেবল একটি কলামযুক্ত ভেক্টর বা ডেটা ফ্রেম Meaning

উদাহরণ:

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
আপনি যদি "কলোনাম (এক্স) [1] <- 'নতুন নাম 2" "
স্কিচআউট

উত্তর:


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
মিশ্র অনুভূতি ... একটি নিখুঁত বিশ্বে, যেখানে নিখুঁত প্রোগ্রামিং ভাষাগুলি প্রচুর পরিমাণে রয়েছে, সেখানে কি কোনও একক কলামের নাম পরিবর্তন করার জন্য সত্যিকারের এই অনেক কীস্ট্রোকের প্রয়োজন হবে? আমি আর কে ভালবাসি তবে মাঝে মাঝে আমি এ জাতীয় কারণে গলা টিপে হত্যা করতে চাই।
গণ্ডগোল_রোস্টার

4
বেসে এটির জন্য কোনও মোড়ক ফাংশন কীভাবে নেই?
ifly6

1
আমরা সবাই কিভাবে কামনা করি! আমি এখনই জানি না, তবে তারপরে বেসে কোনও মোড়ক ছিল না
Side_0o_Effect

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

2
আমি এই সমাধানটি পছন্দ করি কারণ আপনি নামটি দিয়ে কলামের নামটি উল্লেখ করতে পারেন, এটি কোন নম্বর কলামটি তা জানা প্রয়োজনের বিপরীতে। বৃহত্তর সংখ্যা বৈশিষ্ট্যের জন্য আরও ভাল Bet
সাইবারনেটিক

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
renamedplyrপ্যাকেজে এখন একটি ফাংশন ।
স্যাম ফির্ক

36

আমি মনে করি কলামগুলির নামকরণের সর্বোত্তম উপায় হ'ল ডিপি্লায়ার প্যাকেজটি ব্যবহার করে :

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
@ জংশিউউজির সমাধানের তুলনায় এখানে পার্থক্য কী?
বুটজ

which()প্রয়োজন হয় না.
সিন্ড্রি_বলদুর

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/180892


এটি সহজতম, ধন্যবাদ। Dplyr প্যাকেজ নিয়ে সমস্যা ছিল।
ড্যানিবি

4

চেষ্টা করুন:

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

8
ওপি এটির (তার সম্পাদনায়) জিজ্ঞাসা করা ত্রুটিটি ফেলেছিল। এটি কাজ করবে না, কারণ ডেটাফ্রেমে কেবল একটি কলাম থাকে।

। @ এনপিই - কলামের নামটি এমন কিছু "A,B,C,X,Y,Z"যেখানে আমি এটি Yব্যবহার করে পুনরায় নামকরণ করতে চাই সেগুলি কাজ করে বলে মনে হচ্ছে না testData[379] <- "Y"
চেতন অরবিন্দ পাতিল

4

এটি সম্ভবত ইতিমধ্যে সেখানেই রয়েছে তবে সমাধানের সন্ধানের সময় আমি নামকরণের ক্ষেত্রগুলির সাথে খেলছিলাম this আমার উদ্দেশ্যে কাজ করে।

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

সম্পাদনা এখানে শুরু হয় ....

এটি পাশাপাশি কাজ করে।

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

যে কেউ আমাকে চিহ্নিত করেছে, এটি ভাল, তবে যেহেতু আমি এটি করার ক্ষেত্রে স্পষ্টতই নতুন, সম্ভবত আপনি উত্তরটি দিয়ে কী ভুল করেছেন তা আলোকিত করতে পারেন।
স্কটিটি

আপনার উত্তরের সাথে কোনও ভুল নেই, এটি অনলাইনার না হওয়া ছাড়াও .. এটি কেবল একটি প্রতিকূল এসও ব্যবহারকারীর নিজের তন্ত্রকে ন্যায়সঙ্গত করার সাহস নেই।
গণনা 0

ধন্যবাদ @ গণনা 0 এটি কিছু মান পয়েন্ট থাকা বা কোনও প্রশ্নে যা কিছু মন্তব্য করা উচিত তা আসলেই অর্থবহ, এমন কিছু যা আমি এখনও করতে সক্ষম হয়েছি। কিছু ক্ষেত্রে প্রশ্নগুলি অনুসরণ করা ভাল হবে কারণ আমি একটি নতুন দক্ষতা শিখি। আবার। TY।
স্কটিটি

1
এটি ব্যবহার করার জন্য আমাদের সমস্ত কলামের নাম দেওয়া দরকার।
অর্পিত সিসোদিয়া

renameফাংশনটি কোন প্যাকেজ থেকে আসে?
দিয়েগো

3

আপনি যদি জানেন যে আপনার ডেটাফ্রেমে কেবল একটি কলাম রয়েছে, আপনি ব্যবহার করতে পারেন: names(trSamp) <- "newname2"


3

আপনি 'Hmisc' প্যাকেজ থেকে 'আপডেটা' চেষ্টা করে দেখতে পারেন।

library(Hmisc)

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


খুব সুন্দর! এছাড়া আরও কলাম নামান্তর করা সম্ভব হচ্ছে একবার: trSamp = upData (। TrSamp, পুনঃনামকরণ = C (sample.trainer.index..10000 = 'newname2, AnotherColumnName =' RenameThisColumn '))
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.rdocamentation.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: স্ট্রাই_রেপস_ফর্স্ট_রেজেক্সে (স্ট্রিং, প্যাটার্ন, ফিক্স_রেপ্লেসমেন্ট (রিপ্লেসমেন্ট)): দীর্ঘ অবজেক্টের দৈর্ঘ্য সংক্ষিপ্ত বস্তুর দৈর্ঘ্যের 2 নয়: নামগুলিতে [কলস] <- .ফএন (নামগুলি [কলস], ...) : প্রতিস্থাপন করতে আইটেমের সংখ্যা প্রতিস্থাপন দৈর্ঘ্যের একাধিক নয়

এটি প্রাসঙ্গিক নয়, কারণ এটি seq_along(.)প্রতিস্থাপন ফাংশনটির সাথে কেবলমাত্র একটি অসঙ্গতি ।


-1

আমি নিজের নামটি দিয়ে ডেটা ফ্রেমে কেবল নতুন কলাম যুক্ত করব এবং বিদ্যমান কলাম থেকে এটির জন্য ডেটা আনব। এটার মত:

dataf$value=dataf$Article1Order

তাহলে আমি পুরানো কলামটি সরিয়ে ফেলছি! এটার মত:

dataf$Article1Order<-NULL

এই কোডটি নির্বোধ বলে মনে হতে পারে! তবে এটি পুরোপুরি কাজ করে ...


-1

আমি নীচের কোড সহ আমার নতুন নামটি দিয়ে ডেটাসেটে কেবল একটি কলামের নামটি পরিবর্তন করব: নামগুলি (ডাটাসেট) [সূচি_মূল্য] <- "নতুন_কোল_নাম"


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