শর্তসাপেক্ষ (`if`) স্টেটমেন্টের ভিত্তিতে ডেটা ফ্রেমে একটি মান প্রতিস্থাপন করুন


122

নীচে কোড করা আর ডেটা ফ্রেমে, আমি B প্রদর্শিত সমস্ত সময় প্রতিস্থাপন করতে চাই b

junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12])
colnames(junk) <- c("nm", "val")

এটি সরবরাহ করে:

   nm val
1   A   a
2   B   b
3   C   c
4   D   d
5   A   e
6   B   f
7   C   g
8   D   h
9   A   i
10  B   j
11  C   k
12  D   l

আমার প্রথম প্রয়াসটি এরকম একটি forএবং ifবিবৃতি ব্যবহার করার ছিল :

for(i in junk$nm) if(i %in% "B") junk$nm <- "b"

তবে আমি নিশ্চিত যে আপনি দেখতে পাচ্ছেন, এটির junk$nmসাথে মানগুলির সমস্তটি প্রতিস্থাপন করে b। আমি এটি দেখতে পাচ্ছি কেন এটি করা হচ্ছে তবে আমি মনে করতে পারি না যে এটি জাঙ্ক $ n এম এর মূল মূল্যটি কেবল সেখানে প্রতিস্থাপন করতে পারে B

দ্রষ্টব্য: আমি সমস্যাটি সমাধান করতে পেরেছি gsubকিন্তু আরআই শেখার স্বার্থে এখনও আমার মূল পদ্ধতির কাজ সম্পর্কে কীভাবে পেতে হবে তা জানতে চাই (যদি এটি সম্ভব হয়)


1
আপনি স্ট্রিংএফ্যাক্টরগুলি = মিথ্যাটি মূল ডেটাতে যুক্ত করতে চাইতে পারেন ra ফ্রেম নির্মাণ।
জিম্মিবি

@ জিম্বাইব কেন? আর এর বেশিরভাগ মডেলিং কোডের সাথে মডেলিং করা ফ্যাক্টরগুলি দরকারী এবং প্রয়োজনীয়। এটির সাথে ডিল করার সঠিক উপায়টি হ'ল ডেটা একটি ফ্যাক্টর তা স্বীকার করা। আপনি যদি এই রূপান্তরটি চান না / চান না তবে আপনি যা বলবেন তেমন করতে পারেন। আপনি যদি ফ্যাক্টরটি চান, তবে ম্যানিপুলেশনটি করার সহজ উপায় রয়েছে @ কেনি সঞ্চালন করতে চায়।
গ্যাভিন সিম্পসন

1
পারফরম্যান্সের কারণে কারণগুলি আরও বেশি জনপ্রিয় হিসাবে ব্যবহৃত হত, তবে এখন যে স্ট্রিংগুলি অপরিবর্তনীয় এবং কারণগুলির মানগুলি হ্যাশ করেছে তা কম স্পষ্ট নয়, কারণ বেশিরভাগ বেস আর কার্যকারিতা কেবল তাদের (সতর্কতা সহ) সরাসরি রূপান্তরিত করে। আমি মনে করি কারণগুলির ফলে আমি আর পি কোডগুলিতে খুঁজে পাচ্ছি তা উল্লেখযোগ্য সংখ্যক বাগ in
জিম্বাইব

উত্তর:


217

এনএম অক্ষরে রূপান্তর করা এবং তারপরে পরিবর্তনটি করা সহজ:

junk$nm <- as.character(junk$nm)
junk$nm[junk$nm == "B"] <- "b"

সম্পাদনা: এবং যদি আপনাকে অবশ্যই এনএমকে উপাদান হিসাবে বজায় রাখতে হয় তবে শেষ পর্যন্ত এটি যুক্ত করুন:

junk$nm <- as.factor(junk$nm)

4
as.character () উপাদানগুলির সাথে কাজ করার সময় জীবনকে এত সহজ করে তোলে। +1
ব্র্যান্ডন বার্টেলসেন

4
আপনার যদি একাধিক কলাম থাকে?
জিওডেক্স

43

মানগুলি প্রতিস্থাপনের জন্য আরেকটি দরকারী উপায়

library(plyr)
junk$nm <- revalue(junk$nm, c("B"="b"))

25

সংক্ষিপ্ত উত্তর:

junk$nm[junk$nm %in% "B"] <- "b"

সূচক ভেক্টরগুলিকে আর পরিচিতির দিকে একবার দেখুন (যদি আপনি এটি এখনও না পড়েন)।


সম্পাদনা করুন। মন্তব্যগুলিতে লক্ষ্য করা গেছে যে এই সমাধানটি চরিত্রের ভেক্টরগুলির জন্য কাজ করে তাই আপনার ডেটাতে ব্যর্থ হয়।

ফ্যাক্টরের জন্য সেরা উপায়টি স্তর পরিবর্তন করা:

levels(junk$nm)[levels(junk$nm)=="B"] <- "b"

সংক্ষিপ্ত সংযোজন:% তে% এর ব্যবহার কেবলমাত্র যদি আপনার ডানদিকে সেট থাকে তবে সত্যিই সহায়তা করে c("B","C")। এরকম junk$nm[junk$nm == "B"]ভাল উপায় নেই।
থিলো

1
ওহ, আরেকটি, গুরুত্বপূর্ণ সংযোজন: এটির মতো করে করার জন্য প্রথমে ফ্যাক্টর স্তরটি bএনএমকে যুক্ত করা দরকার। ডিলিওপের সংস্করণটি যদি আপনি চরিত্রগুলির সাথে কাজ করতে চান তবে বিষয়গুলির চেয়ে বেশি ভাল। (সর্বদা আপনার ভেরিয়েবলগুলির টাইপটি সম্পর্কে সর্বদা চিন্তা করুন!)
থিলো

@Kenny দ্বারা নির্মিত হিসাবে এটি ডেটাতে কাজ করে না কারণ ডেটা উপাদান কারণ। আপনি কি কোনও পদক্ষেপ ভুলে গেছেন বা চরিত্রগুলিকে উপাদানগুলিতে রূপান্তর বন্ধ করার জন্য আপনার কী বিশ্বব্যাপী সেটিং আছে?
গ্যাভিন সিম্পসন

4
তার মধ্যে গুরুত্বপূর্ণ পার্থক্য @Thilo ওয়ান %in%এবং ==হয় NAসামলাচ্ছে না: c(1,2,NA)==1দেয় TRUE, FALSE, NAকিন্তু c(1,2,NA) %in% 1দেয় TRUE, FALSE, FALSE। এবং হ্যাঁ আমি এই কাজটি পরীক্ষা করতে ভুলে গেছি: /
মারেক

20

আপনার প্রদর্শিত ডেটাটি উপাদান হিসাবে, এটি কিছুটা জটিল করে তোলে। @ ডিলিওপের উত্তর nmএকটি চরিত্রের পরিবর্তনশীলতে রূপান্তরিত করে সমস্যার দিকে এগিয়ে যায় । মূল কারণগুলিতে ফিরে যেতে আরও একটি পদক্ষেপ প্রয়োজন।

একটি বিকল্প হ'ল স্থানে ফ্যাক্টরের স্তরগুলি পরিচালনা করা।

> lev <- with(junk, levels(nm))
> lev[lev == "B"] <- "b"
> junk2 <- within(junk, levels(nm) <- lev)
> junk2
   nm val
1   A   a
2   b   b
3   C   c
4   D   d
5   A   e
6   b   f
7   C   g
8   D   h
9   A   i
10  b   j
11  C   k
12  D   l

এটি বেশ সহজ এবং আমি প্রায়শই ভুলে যাই যে এর জন্য একটি প্রতিস্থাপন ফাংশন রয়েছে levels()

সম্পাদনা: মন্তব্যগুলিতে @ শেঠ দ্বারা উল্লিখিত হিসাবে, এটি পরিষ্কার-ক্ষতি ছাড়াই ওয়ান-লাইনারে করা যেতে পারে:

within(junk, levels(nm)[levels(nm) == "B"] <- "b")

6
খুশী হলাম। আমি প্রতিস্থাপন ফাংশন সম্পর্কে জানতাম না levels()। ওয়ান লাইনার junk <- within(junk, levels(nm)[levels(nm)=="B"] <- "b")কেমন?

তবে আপনি এটি দু'বার কল করেছেন :)
মারেক 23

2
@ মারেক মাথার উপরে চড় মারলেন কেবল দেখানোর জন্য যে যখন ঘুমানোর সময় ভাল হয় তখন কেউ তার নিজের মন্তব্যে সাড়া না দেয়। এটি আবার চেষ্টা করা যাক ...
গ্যাভিন সিম্পসন

@ সত্যই - চমৎকার। নিশ্চিত না কেন আমি পদক্ষেপগুলি পৃথক করেছি? সম্ভবত প্রকাশের জন্য ...
গ্যাভিন সিম্পসন

11

এক কমান্ডে এটি করার সবচেয়ে সহজ উপায় হ'ল কমান্ড ব্যবহার করা whichএবং এটি করার মাধ্যমে উপাদানগুলিকে চরিত্রের মধ্যে পরিবর্তন করার প্রয়োজন নেই:

junk$nm[which(junk$nm=="B")]<-"b"

5

আপনি এতে একটি ফ্যাক্টর ভেরিয়েবল তৈরি করেছেন nmযাতে আপনার এটি করা এড়ানো বা ফ্যাক্টর বৈশিষ্ট্যগুলিতে একটি অতিরিক্ত স্তর যুক্ত করা দরকার। আপনি ব্যবহার এড়ানো উচিত<- ডেটা.ফ্রেম () এর আর্গুমেন্টে

বিকল্প 1:

junk <- data.frame(x = rep(LETTERS[1:4], 3), y =letters[1:12], stringsAsFactors=FALSE)
junk$nm[junk$nm == "B"] <- "b"

বিকল্প 2:

levels(junk$nm) <- c(levels(junk$nm), "b")
junk$nm[junk$nm == "B"] <- "b"
junk

@ ডিওয়ান সমস্যা এবং আপনার পরিবর্তনশীল ধরণের বিবেচনা করার প্রয়োজনীয়তার বিষয়ে আপনার ইনপুট জন্য ধন্যবাদ। আমি @ ডিলিওপের উত্তরটি গ্রহণ করেছি কারণ এটি প্রথম কাজকর্ম ছিল। আমি জানি <- বনাম = তবে অনেকগুলি সমস্যা রয়েছে তবে (যদি এর সংক্ষিপ্ত উত্তর দেওয়া যায়) কেন = ব্যবহার করা উচিত data.frame?
DQdlM

আপনি যোগ করতে প্রয়োজন হবে না bএকটি স্তর হিসাবে, শুধু স্তর যে পরিবর্তন Bকরার জন্য b
গ্যাভিন সিম্পসন

@ কেনিপিন্টস: কলামের নামটি একটি ইস্যু, দেখুন a <- data.frame(x<-1:10)। এর কলামের নামটি xবরং অগোছালো নয় x....1.10। ডেটা.ফ্রেম ব্যবহার করা আরও ভাল (x = 1: 10)। তারপরে আপনি জানেন যে আপনার কলামের নাম কী।
IRTFM

@ গ্যাভিন: প্রতিস্থাপনের চেয়ে যোগ করা সহজ এবং এটিকে একটি কারণ হিসাবে তৈরি করা নাও সহজ।
আইআরটিএফএম

@ ডুইন ইজিজি? আমি দ্বিমত পোষণ করছি - সাধারণ কোনও কিছুর জন্য আমার উত্তর দেখুন। স্তরগুলি যুক্ত করা আপনাকে ধরতে পারে, মডেলিংয়ে বলুন predict()যার সাথে অভিযোগ করবে যদি নতুন ডেটাতে উপাদানগুলির মাত্রা মডেলটির সাথে ফিট না হয় তবে। সংক্ষিপ্ত কাটগুলির উপর নির্ভর না করে সঠিকভাবে ডেটা ফর্ম্যাট করার জন্য দীর্ঘমেয়াদে ক্লিনার। আমি একমত যে এটিকে একটি কারণ হিসাবে তৈরি করা সহজ নয়, তবে এটি যদি ইতিমধ্যে একটি হয় বা কিছু মডেলিং অনুশীলনের জন্য এক হতে হয় ...
গ্যাভিন সিম্পসন

1

আপনি যদি চরিত্রের ভেরিয়েবলগুলির সাথে কাজ করে থাকেন (তবে stringsAsFactorsএখানে নকলটি নোট করুন) আপনি প্রতিস্থাপনটি ব্যবহার করতে পারেন:

junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12], stringsAsFactors = FALSE)
colnames(junk) <- c("nm", "val")

junk$nm <- replace(junk$nm, junk$nm == "B", "b")
junk
#    nm val
# 1   A   a
# 2   b   b
# 3   C   c
# 4   D   d
# ...

0
stata.replace<-function(data,replacevar,replacevalue,ifs) {
  ifs=parse(text=ifs)
  yy=as.numeric(eval(ifs,data,parent.frame()))
  x=sum(yy)
  data=cbind(data,yy)
  data[yy==1,replacevar]=replacevalue
  message=noquote(paste0(x, " replacement are made"))
  print(message)
  return(data[,1:(ncol(data)-1)])
}

নীচে লাইন ব্যবহার করে এই ফাংশন কল করুন।

d=stata.replace(d,"under20",1,"age<20")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.