আর এর উপাদানগুলি: বিরক্তির চেয়ে আরও বেশি?


95

আর এর প্রাথমিক তথ্য ধরণের একটি হ'ল ফ্যাক্টর। আমার অভিজ্ঞতার কারণগুলি মূলত একটি ব্যথা এবং আমি সেগুলি কখনই ব্যবহার করি না। আমি সর্বদা চরিত্রে রূপান্তর করি। আমি অদ্ভুতভাবে অনুভব করছি যে আমি কিছু মিস করছি।

ফাংশনগুলির কয়েকটি গুরুত্বপূর্ণ উদাহরণ রয়েছে যা ফ্যাক্টর ডেটা টাইপ প্রয়োজনীয় হয়ে ওঠে সেখানে গ্রুপিং ভেরিয়েবল হিসাবে ফ্যাক্টর ব্যবহার করে? আমার যখন কারণগুলি ব্যবহার করা উচিত তখন কি কোনও নির্দিষ্ট পরিস্থিতি রয়েছে?


7
আমি এই মন্তব্যটি প্রাথমিকের আর ব্যবহারকারীদের জন্য যুক্ত করছি যারা সম্ভবত এই প্রশ্নটি খুঁজে পাবে। আমি সম্প্রতি একটি ব্লগ পোস্ট লিখেছি যা নীচে উত্তরগুলি থেকে অনেক তথ্য সংকলন করেছে একটি টিউটোরিয়াল টিউটোরিয়ালে কখন, কীভাবে এবং কেন কারণ ব্যবহার করতে হবে সে সম্পর্কে R. gormanalysis.com/?p=115
বেন

আমি সবসময় ধরে নিয়েছিলাম যে উপাদানগুলি অক্ষরের চেয়ে বেশি দক্ষতার সাথে সঞ্চিত ছিল — যেন প্রতিটি এন্ট্রি স্তরের পয়েন্টার were কিন্তু এটি লেখার জন্য এটি পরীক্ষার সময়, আমি খুঁজে পেলাম যে সত্য নয়!
isomorphismes

4
@isomorphismes ভাল, যে ব্যবহৃত , সত্য হতে পারে আর আগের দিন, কিন্তু যে পরিবর্তন করা হয়েছে। এই ব্লগ পোস্টে দেখুন: simplystatistics.org/2015/07/24/...
MichaelChirico

4
5+ বছর পরে এই "stringsAsFactors: একটি অননুমোদিত জীবনী" লেখা হয়েছিল: simplystatistics.org/2015/07/24/...
জেডি লং

উত্তর:


49

আপনার ফ্যাক্টর ব্যবহার করা উচিত। হ্যাঁ তারা ব্যাথা হতে পারে, কিন্তু আমার তত্ত্ব যে কারণে তারা এর ব্যথা করছি 90% কারণ হয় read.tableএবং read.csv, যুক্তি stringsAsFactors = TRUEডিফল্টরূপে (এবং সবচেয়ে ব্যবহারকারীদের এই তনিমা মিস্)। আমি বলছি এগুলি দরকারী কারণ lme4 ব্যবহারের মতো মডেল ফিটিং প্যাকেজগুলি এবং বিভিন্ন কারণে মডেলগুলিকে ফিট করে এবং বিপরীতে ব্যবহারের ধরণ নির্ধারণ করে factors এবং গ্রাফিং প্যাকেজগুলি এগুলি দ্বারা গোষ্ঠীভুক্ত করে। ggplotএবং বেশিরভাগ মডেল ফিটিং ফাংশনগুলি চরিত্রের ভেক্টরকে উপাদানগুলির জন্য বাধ্য করে, ফলে ফলাফলটি একই। তবে, আপনি আপনার কোডে সতর্কতা দিয়ে শেষ করেছেন:

lm(Petal.Length ~ -1 + Species, data=iris)

# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris)

# Coefficients:
#     Speciessetosa  Speciesversicolor   Speciesvirginica  
#             1.462              4.260              5.552  

iris.alt <- iris
iris.alt$Species <- as.character(iris.alt$Species)
lm(Petal.Length ~ -1 + Species, data=iris.alt)

# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris.alt)

# Coefficients:
#     Speciessetosa  Speciesversicolor   Speciesvirginica  
#             1.462              4.260              5.552  

সতর্কতা বার্তা: এতে model.matrix.default(mt, mf, contrasts):

পরিবর্তনশীল Speciesa এ রূপান্তরিতfactor

একটি ছদ্মবেশী জিনিস পুরো drop=TRUEবিট। ভেক্টরগুলিতে এটি ডেটাতে নেই এমন কারণগুলির স্তরগুলি সরাতে ভাল কাজ করে। উদাহরণ স্বরূপ:

s <- iris$Species
s[s == 'setosa', drop=TRUE]
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa
s[s == 'setosa', drop=FALSE]
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica

তবে এর সাথে data.frame, এর আচরণটি [.data.frame()আলাদা this এই ইমেলটি দেখুন বা ?"[.data.frame"। এটি ব্যবহার drop=TRUEকরা data.frameআপনার কল্পনা মতো কাজ করে না:

x <- subset(iris, Species == 'setosa', drop=TRUE)  # susbetting with [ behaves the same way
x$Species
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica

ভাগ্যক্রমে আপনি droplevels()একটি পৃথক ফ্যাক্টরের জন্য বা কোনও ফ্যাক্টরের প্রতিটি ফ্যাক্টরের জন্য data.frame(আর 2.12 সাল থেকে) অব্যবহৃত ফ্যাক্টর স্তরগুলি সহজেই ফেলে দিতে পারেন :

x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa"     "versicolor" "virginica" 
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"

ggplotকিংবদন্তি পেতে আপনি যে স্তরগুলি বেছে নিয়েছেন তা এটি কীভাবে রাখবেন This

অভ্যন্তরীণভাবে factorগুলি হ'ল একটি বিশিষ্ট স্তরের অক্ষর ভেক্টর (দেখুন attributes(iris$Species)এবং class(attributes(iris$Species)$levels)) এর সাথে পূর্ণসংখ্যা , যা পরিষ্কার। যদি আপনাকে কোনও স্তরের নাম পরিবর্তন করতে হয় (এবং আপনি চরিত্রের স্ট্রিং ব্যবহার করছিলেন), এটি অনেক কম দক্ষ অপারেশন হবে। এবং আমি স্তরের নামগুলি অনেকগুলি পরিবর্তন করি, বিশেষত ggplotকিংবদন্তিদের জন্য । যদি আপনি চরিত্রের ভেক্টরগুলির সাথে ভুয়া ফ্যাক্টর তৈরি করেন, তবে ঝুঁকি রয়েছে যে আপনি কেবল একটি উপাদান পরিবর্তন করবেন এবং দুর্ঘটনাক্রমে একটি পৃথক নতুন স্তর তৈরি করবেন।


4
stringsAsFactorsকোন কাজ নয়।
আইআরটিএফএম

30

অর্ডারকৃত উপাদানগুলি দুর্দান্ত, যদি আমি কমলা পছন্দ করি এবং আপেলকে ঘৃণা করি তবে আঙ্গুর কিছু মনে করবেন না এটি বলার জন্য আমার কিছু অদ্ভুত সূচি পরিচালনা করার দরকার নেই:

d <- data.frame(x = rnorm(20), f = sample(c("apples", "oranges", "grapes"), 20, replace = TRUE, prob = c(0.5, 0.25, 0.25)))
d$f <- ordered(d$f, c("apples", "grapes", "oranges"))
d[d$f >= "grapes", ]

এটি একটি ঝরঝরে অ্যাপ্লিকেশন। কখনও ভেবে দেখিনি।
জেডি লং

কি করল d$f <- ordered(d$f, c("apples", "grapes", "oranges"))? আমি অনুমান করতে পারি যে এটি ডেটা ফ্রেমে এগুলি অর্ডার করেছে, তবে আমি সেই লাইনটি চালনা করে ডেটা ফ্রেমটি প্রিন্ট করার পরে কোনও পরিবর্তন হয় না। মুদ্রিত আদেশ পরিবর্তন না হলেও এটি কি কেবল অভ্যন্তরীণ আদেশ চাপিয়ে দেয়?
অ্যাডিম

... হ্যাঁ, আমার মনে হয় আমি যা লিখেছিলাম তা একটি সঠিক বাক্যটির মতো। যদি আমি আপনার বক্তব্যটি বুঝতে পারি তবে আপনি আমাদের দেখিয়ে দিচ্ছেন যে আপনি কারণগুলির উপর একটি অর্ডার অর্পণ করতে পারেন, যা স্ট্রিংগুলির জন্য আপনি না করতে পারেন is
অ্যাডিম

4
অর্ডার করা () যে কোনও মান থেকে একটি স্বেচ্ছাসেবী অর্ডার তৈরি করে - আপনি যে ক্রম অনুসারে সেগুলি অর্ডার করা হয়েছে। এটি দুর্ভাগ্য যে আমি অভিধানের ভিত্তিতে বাছাই করা মানগুলি ব্যবহার করেছি, এটি একটি কাকতালীয় ঘটনা। উদাহরণস্বরূপ আমি এটি ডেটাতে ব্যবহার করি যেখানে "জেড" খারাপ, "3" ভাল তবে লেবেলগুলি সংখ্যাসূচক বা বর্ণানুক্রমিক নয় - তাই আমি আদেশ করি (ডেটা, সি ("জেড", "বি", "এ", " 0 "," 1 "," 2 "," 3 ")) এবং তাই আমি কেবল ডেটা>" এ "করতে পারি এবং এটি শুভ দিন।
mdsumner

19

factorঅন্যান্য ভাষাগুলিতে একটি গণনা করা টাইপের সাথে সাদৃশ্যপূর্ণ। এর যথাযথ ব্যবহারটি একটি চলকের জন্য যা কেবলমাত্র নির্ধারিত মানগুলির একটিতে গ্রহণ করতে পারে। এই ক্ষেত্রে, প্রতিটি সম্ভাব্য অনুমোদিত মান কোনও নির্দিষ্ট সেট ডেটাতে উপস্থিত নাও হতে পারে এবং "খালি" স্তরগুলি সঠিকভাবে এটি প্রতিফলিত করে।

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

factorগুলি এর অন্যান্য দিক যেমন স্ট্রিংয়ের সেটকে একটি স্বেচ্ছাসেবক অর্ডার দেওয়ার একটি উপায় প্রদান করা, এর গুলিগুলির গৌণ বৈশিষ্ট্য factor, তবে তাদের অস্তিত্বের কারণ নয়।


4
+1 ব্রায়ান, আমি মনে করি আপনি ডেটাতে উপস্থিত না থাকার ক্যাপচারের সাথে মাথার নখটি আঘাত করলেন।
রিকার্ডো সাপোর্টা

13

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

#drop a whole bunch of unused levels from a whole bunch of columns that are factors using gdata
require(gdata)
drop.levels(dataframe)

আমি জানি যে কোনও ফ্যাক্টরের স্তরগুলি পুনরায় পুনর্নির্মাণ করা এবং লেবেলগুলিকে পুনরায় সঞ্চারিত করা সহজ স্তর এবং স্তরগুলি পুনর্বিন্যাস করার জন্য দুর্দান্ত উপায় রয়েছে। আমার মস্তিষ্ক কেবল তাদের স্মরণ করতে পারে না এবং আমি যতবার এটি ব্যবহার করি ততবারই আমাকে এটি পুনরায় প্রকাশ করতে হবে। রেকডিং করা তার চেয়ে অনেক সহজ হওয়া উচিত।

আর এর স্ট্রিং ফাংশনগুলি ব্যবহার করা বেশ সহজ এবং যৌক্তিক। সুতরাং হেরফের করার সময় আমি সাধারণত উপাদানগুলির চেয়ে অক্ষর পছন্দ করি।


4
আপনার কাছে কি পরিসংখ্যান বিশ্লেষণের উদাহরণ রয়েছে যা ব্যবহার করে?
জেডি লং

4
এখন একটি বেস-আর ফাংশন আছে droplevels()। এবং এটি ডিফল্টরূপে উপাদানগুলি পুনরায় অর্ডার করে না।
বেন বলকার

6

কী ছদ্মবেশী শিরোনাম!

আমি বিশ্বাস করি অনেক অনুমানের ফাংশন আপনাকে সহজেই ডামি ভেরিয়েবলগুলি সংজ্ঞায়িত করতে ফ্যাক্টরগুলি ব্যবহার করার অনুমতি দেয় ... তবে আমি সেগুলির জন্য সেগুলি ব্যবহার করি না।

আমি যখন কয়েকটি অনন্য পর্যবেক্ষণ সহ খুব বড় চরিত্রের ভেক্টর রাখি তখন আমি সেগুলি ব্যবহার করি। এটি মেমরির খরচ কমাতে পারে, বিশেষত যদি চরিত্রের ভেক্টরের স্ট্রিং দীর্ঘতর হয়।

পিএস - আমি শিরোনামটি নিয়ে মজা করছি। আমি আপনার টুইট দেখেছি। ;-)


4
সুতরাং আপনি সত্যিই কেবল স্টোরেজ স্পেস সংরক্ষণ করতে তাদের ব্যবহার করুন। এটা বোধগম্য.
জেডি লং

13
কমপক্ষে এটি ব্যবহৃত ;-)। তবে কয়েকটি আর সংস্করণ পূর্বে অক্ষরের স্টোরেজটি অভ্যন্তরীণভাবে হ্যাশ করার জন্য পুনরায় লেখা হয়েছিল তাই এই historicতিহাসিক যুক্তির অংশটি এখন বাতিল। গ্রুপিং এবং মডেলিংয়ের জন্য এখনও উপাদানগুলি খুব কার্যকর।
ডার্ক এডেলবুয়েটেল

4
?factorএটি অনুযায়ী আর -২.6.০ ছিল এবং এটিতে বলা হয়েছে, "পূর্ণসংখ্যা মানগুলি 4 বাইটে সংরক্ষণ করা হয় যেখানে প্রতিটি অক্ষরের স্ট্রিংয়ের রেফারেন্সের জন্য 4 বা 8 বাইটের পয়েন্টার প্রয়োজন হয়।" চরিত্রের স্ট্রিংয়ের জন্য 8 বাইটের প্রয়োজন হলে আপনি স্থানকে ফ্যাক্টারে রূপান্তর করবেন?
জোশুয়া উলিরিখ

4
এন <- 1000; একটি <- নমুনা (সি ("এ", "বি", "সি"), এন, প্রতিস্থাপন = সত্য); মুদ্রণ (অবজেক্ট.সাইজ (ক), ইউনিট = "কেবি"); মুদ্রণ (অবজেক্ট.সাইজ (ফ্যাক্টর (ক)), ইউনিট = "কেবি"); 8 কেবি 4.5 কেবি তাই এটি এখনও কিছু জায়গা সঞ্চয় করে বলে মনে হচ্ছে।
এডুয়ার্ডো লিওনি

4
@ এদুয়ার্ডো আমি 4Kb বনাম 4.2Kb পেয়েছি। জন্য N=100000আমি 391,5 Kb, বনাম 391,8 Kb, পেয়েছিলাম। সুতরাং ফ্যাক্টরটি একটু বেশি স্মৃতি নেয়।
মেরেক

1

উপাদানগুলি একটি দুর্দান্ত "অনন্য-কেস" ব্যাজিং ইঞ্জিন। আমি এটিকে অনেকবার পুনরায় তৈরি করেছি এবং মাঝে মাঝে বেশ কয়েকবার কুঁচকে যাওয়ার পরেও তারা অত্যন্ত শক্তিশালী।

library(dplyr)
d <- tibble(x = sample(letters[1:10], 20, replace = TRUE))

## normalize this table into an indexed value across two tables
id <- tibble(x_u = sort(unique(d$x))) %>% mutate(x_i = row_number())
di <- tibble(x_i = as.integer(factor(d$x)))


## reconstruct d$x when needed
d2 <- inner_join(di, id) %>% transmute(x = x_u)
identical(d, d2)
## [1] TRUE

এই কাজটি করার আরও ভাল উপায় যদি আমি এটি দেখতে পছন্দ করি তবে আমি factorআলোচনার এই ক্ষমতাটি দেখতে পাচ্ছি না ।


-2

ট্যাপ্লি (এবং সামগ্রিক ) উপাদানগুলির উপর নির্ভর করে। এই ফাংশনগুলির তথ্য থেকে চেষ্টা অনুপাত খুব বেশি।

উদাহরণস্বরূপ, কোডের একক লাইনে ( নীচে ট্যাপ লাগানোর জন্য কল ) আপনি কাটা এবং রঙের দ্বারা হিরার গড় মূল্য পেতে পারেন:

> data(diamonds, package="ggplot2")

> head(dm)

   Carat     Cut    Clarity Price Color
1  0.23     Ideal     SI2   326     E
2  0.21   Premium     SI1   326     E
3  0.23      Good     VS1   327     E


> tx = with(diamonds, tapply(X=Price, INDEX=list(Cut=Cut, Color=Color), FUN=mean))

> a = sort(1:diamonds(tx)[2], decreasing=T)  # reverse columns for readability

> tx[,a]

         Color
Cut         J    I    H    G    F    E    D
Fair      4976 4685 5136 4239 3827 3682 4291
Good      4574 5079 4276 4123 3496 3424 3405
Very Good 5104 5256 4535 3873 3779 3215 3470
Premium   6295 5946 5217 4501 4325 3539 3631
Ideal     4918 4452 3889 3721 3375 2598 2629

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