আর-তে অসামঞ্জস্যিত ফর্ম্যাটের ডেটা পরিষ্কার করছেন?


16

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

তবে এখনও কিছু ধরণের ডেটা রয়েছে যা দক্ষতার সাথে পরিচালনা করতে আমার সমস্যা হয়। উদাহরণ স্বরূপ:

> d <- data.frame(subject = c(1,2,3,4,5,6,7,8,9,10,11),
+   hours.per.day = c("1", "2 hours", "2 hr", "2hr", "3 hrs", "1-2", "15 min", "30 mins", "a few hours", "1 hr 30 min", "1 hr/week"))
> d
   subject hours.per.day
1        1             1
2        2       2 hours
3        3          2 hr
4        4           2hr
5        5         3 hrs
6        6           1-2
7        7        15 min
8        8       30 mins
9        9   a few hours
10      10   1 hr 30 min
11      11     1 hr/week

hours.per.dayএকটি নির্দিষ্ট ক্রিয়ায় ব্যয় করা প্রতিদিনের গড় সংখ্যাকে বোঝানো হয়, তবে আমাদের কাছে যা বিষয় ছিল তা হ'ল। ধরুন আমি অস্পষ্ট প্রতিক্রিয়া নিয়ে কী করব সে সম্পর্কে কিছু সিদ্ধান্ত নিয়েছি এবং আমি নীচের মতো পরিপাটি পরিবর্তনশীল চাই hours.per.day2

   subject hours.per.day hours.per.day2
1        1             1      1.0000000
2        2       2 hours      2.0000000
3        3          2 hr      2.0000000
4        4           2hr      2.0000000
5        5         3 hrs      3.0000000
6        6           1-2      1.5000000
7        7        15 min      0.2500000
8        8       30 mins      0.5000000
9        9   a few hours      3.0000000
10      10   1 hr 30 min      1.5000000
11      11     1 hr/week      0.1428571

ধরে নিই যে মামলার সংখ্যাটি বেশ বড় (1000 বলুন) এবং জেনেও যে বিষয়গুলি তাদের পছন্দ মতো কিছু লিখতে মুক্ত ছিল, এটির কাছে যাওয়ার সর্বোত্তম উপায় কোনটি?

উত্তর:


13

আমি জানি যে স্ট্রিংগুলি আমি জানতাম এবং তারপরে বাকীটি হাত দ্বারা করব identify

test <- c("15min", "15 min", "Maybe a few hours", 
          "4hr", "4hour", "3.5hr", "3-10", "3-10")
new_var <- rep(NA, length(test))

my_sub <- function(regex, new_var, test){
    t2 <- gsub(regex, "\\1", test)
    identified_vars <- which(test != t2)
    new_var[identified_vars] <- as.double(t2[identified_vars])
    return(new_var)    
}

new_var <- my_sub("([0-9]+)[ ]*min", new_var, test)
new_var <- my_sub("([0-9]+)[ ]*(hour|hr)[s]{0,1}", new_var, test)

আপনার হাত বদলাতে হবে এমনগুলির সাথে কাজ পেতে আমি এই জাতীয় কিছু প্রস্তাব দিই:

# Which have we not found
by.hand <- which(is.na(new_var))

# View the unique ones not found
unique(test[by.hand])
# Create a list with the ones
my_interpretation <- list("3-10"= 5, "Maybe a few hours"=3)
for(key_string in names(my_interpretation)){
    new_var[test == key_string] <- unlist(my_interpretation[key_string])
}

এটি দেয়:

> new_var
[1] 15.0 15.0  3.0  4.0  4.0  3.5  5.0  5.0

Regex কিছুটা জটিল হতে পারে, প্রতিবার আমি রেইগেক্স দিয়ে কিছু করছি আমি কয়েকটি সাধারণ পরীক্ষা চালাই। ম্যানুয়াল জন্য regex। এখানে কিছু প্রাথমিক আচরণ:

> # Test some regex
> grep("[0-9]", "12")
[1] 1
> grep("[0-9]", "12a")
[1] 1
> grep("[0-9]$", "12a")
integer(0)
> grep("^[0-9]$", "12a")
integer(0)
> grep("^[0-9][0-9]", "12a")
[1] 1
> grep("^[0-9]{1,2}", "12a")
[1] 1
> grep("^[0-9]*", "a")
[1] 1
> grep("^[0-9]+", "a")
integer(0)
> grep("^[0-9]+", "12222a")
[1] 1
> grep("^(yes|no)$", "yes")
[1] 1
> grep("^(yes|no)$", "no")
[1] 1
> grep("^(yes|no)$", "(yes|no)")
integer(0)
> # Test some gsub, the \\1 matches default or the found text within the ()
> gsub("^(yes|maybe) and no$", "\\1", "yes and no")
[1] "yes"

ম্যাক্স উত্তরের জন্য ধন্যবাদ। আমি নিয়মিত প্রকাশের সাথে পরিচিত নই তাই তাদের সম্পর্কে জানতে হবে। কীভাবে আপনি হাত দিয়ে বাকী কাজগুলি চালিয়ে যাবেন তার একটি সংক্ষিপ্ত বিবরণ দিতে আপনি কি আপত্তি করবেন? হাত দিয়ে যেসব মামলা করা new_var[by.hand] <- c(2, 1, ...)হয় by.handতার TRUEজন্য যেমন কিছু করার চেয়ে আরও ভাল উপায় আছে কি ?
999

@ চিহ্ন 999: আপনি কীভাবে হাতের সাহায্যে এটি করতে পারেন তার কয়েকটি উদাহরণ এবং একটি পরামর্শ যুক্ত করা হয়েছে।
ম্যাক্স গর্ডন

1
যে কোনও ধরণের ডেটা ম্যানিপুলেশনের জন্য নিয়মিত প্রকাশগুলি অতি-গুরুত্বপূর্ণ: ওপি যেমন তথ্য উপাত্ত পরিষ্কার করে দেয় বা ফাইল, এইচটিএমএল ইত্যাদি থেকে ডেটা আহরণের জন্য (যথাযথ এইচটিএমএল-র জন্য, লাইব্রেরি রয়েছে, XMLযাতে আপনাকে ডেটা আহরণে সহায়তা করতে পারে তবে এটি এইচটিএমএল ত্রুটিযুক্ত হলে কাজ করে না))
ওয়েইন

6

@ ম্যাক্সের পরামর্শটি ভাল। মনে হচ্ছে আপনি যদি একটি অ্যালগরিদম লিখেন যা সংখ্যার পাশাপাশি সাধারণ সময় সম্পর্কিত শব্দ / সংক্ষেপগুলি স্বীকৃতি দেয় তবে আপনি বেশিরভাগ পথটি পাবেন। এটি সুন্দর কোড হবে না তবে এটি কাজ করবে এবং সমস্যাগুলির সাথে জুড়ে আসার সাথে সাথে আপনি এটি সময়ের সাথে উন্নতি করতে পারবেন।

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

মূলত, প্রাকৃতিক ভাষার পার্সিং একটি সাধারণ সমস্যা এবং আপনি আর ছাড়া অন্য ভাষাগুলিতে সমাধান সন্ধান করতে হবে R আপনি আর কোনও ভাষাতে এমন সরঞ্জাম তৈরি করতে পারেন যা আপনি আর ব্যবহার করে অ্যাক্সেস করতে পারেন, বা খুব কমপক্ষে আপনি নিজের এলগরিদমের জন্য ভাল ধারণা পেতে পারেন।


4

এর মতো কোনও কিছুর জন্য, যদি এটি যথেষ্ট দীর্ঘ হয় তবে আমি মনে করি যে আমি নিয়মিত প্রকাশ এবং রূপান্তর নিয়মের একটি তালিকা চাই এবং নতুন মানগুলি অন্য কলামে নিয়ে যাব (যাতে আপনার কাছে সর্বদা কাঁচা ডেটা পুনরায় লোড না করে ডাবল চেক করার সুযোগ থাকে) ; সমস্ত ডেটা রুপান্তরিত না হওয়া বা সমস্ত নিয়ম শেষ না হওয়া অবধি আর-এ-এত-দূর-রূপান্তরিত ডেটাতে প্রয়োগ করা হবে। যৌক্তিক মানগুলির একটি তালিকা রাখাও সম্ভবত সেরা যা এটি নির্দেশ করে যে কোন সারিগুলি এখনও রূপান্তরিত হয়নি।

এই জাতীয় কয়েকটি নিয়ম অবশ্যই স্পষ্ট এবং সম্ভবত 80-90% কেস পরিচালনা করবে, তবে বিষয়টি হ'ল এমন সবসময় থাকবে যা আপনি জানেন না এমনগুলি আসবে (লোকেরা খুব উদ্ভাবক)।

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

কোনও কেস এড়িয়ে যাওয়ার বিকল্পটি থাকাও যুক্তিসঙ্গত হতে পারে (যাতে আপনি সহজতর ক্ষেত্রে যেতে পারেন), যাতে আপনি খুব শক্ত ক্ষেত্রে শেষ পর্যন্ত ডেকে রাখতে পারেন।

সবচেয়ে খারাপ ঘটনা, আপনি হাতে হাতে কয়েক করেন।

এরপরে আপনি যখন ডেটা বৃদ্ধি করেন বা নতুন, অনুরূপ ডেটা সেট বরাবর আসে তখন আবার প্রয়োগ করার জন্য আপনি যে নিয়ম তৈরি করেন তার পুরো তালিকা রাখতে পারেন।

আমি জানি না যে এটি দূর থেকে সর্বোত্তম অনুশীলনের কাছে পৌঁছেছে (আমি মনে করি সেখানে আরও কিছু আনুষ্ঠানিক কিছু প্রয়োজন হবে) তবে বিপুল পরিমাণে এই জাতীয় ডেটা দ্রুত প্রক্রিয়াকরণের ক্ষেত্রে এটির কিছু মূল্য থাকতে পারে।


উত্তরের জন্য ধন্যবাদ, গ্লেন। এটা খুব আবেদনময়ী মনে হচ্ছে। কেবলমাত্র সেগুলি সমস্ত প্রদর্শন করার এবং সেই আউটপুটটির দিকে তাকানোর বিপরীতে আপনি একবারে কী এখনও-রূপান্তরিত মানগুলি উপস্থাপন করা একটি বড় সুবিধা হিসাবে দেখছেন? আমি একবারে জিনিস উপস্থাপনের মতো কিছুই করিনি।
999

1
@ চিহ্ন 999, আমি একবারে উপস্থাপনা করার সুবিধা এবং অসুবিধা উভয়ই মনে করব। সুবিধাটি সরলতা - একটি অস্পষ্ট সময় প্রদর্শন করতে বিড়াল () ব্যবহার করা এবং সেই সময়ের আপনার ব্যাখ্যা রেকর্ড করতে স্ক্যান () ব্যবহার করা সহজ implement অসুবিধাটি হ'ল আপনি প্রচুর এন্ট্রিগুলির বড় ছবিটি মিস করতে পারেন যা আপনি রেগেক্স কোডের একক লাইন দিয়ে ম্যাসেস সংশোধন করতে পারেন। আপনি কী পাওয়ার আশা করছেন সে সম্পর্কে আপনার ধারণা থাকতে পারে: আপনি যদি এই সমস্যাটি সমাধান করতে চান তবে এটি হাতে হাতে করুন do আপনি যদি আর সম্পর্কে আরও জানতে চান তবে একটি সমাধান কোড করার চেষ্টা করুন।
অ্যাশ

জবাবের অভাবের জন্য দুঃখিত; আমি অ্যাশের মন্তব্যের সাথে বিস্তৃতভাবে একমত
Glen_b -Rininstate Monica

4

আর কিছু রয়েছে মান ডেটা ম্যানিপুলেশন জন্য ফাংশন, যা পরিষ্কার ডেটার জন্য ব্যবহার করা যেতে পারে, তার মধ্যে বেস (প্যাকেজ gsub, transformযেমন, সেইসাথে বিভিন্ন তৃতীয় পক্ষের প্যাকেজ ইত্যাদি), stringr , পুনর্নির্মাণ , reshape2 এবং plyr । উদাহরণ এবং এই প্যাকেজের জন্য ব্যবহারের সর্বোত্তম কার্যাভ্যাস এবং তাদের কার্যাবলী নিম্নলিখিত কাগজে বর্ণনা করা হয়েছে: http://vita.had.co.nz/papers/tidy-data.pdf

উপরন্তু, আর অফার কিছু প্যাকেজ বিশেষভাবে দৃষ্টি নিবদ্ধ করা ডেটা পরিষ্কার এবং রূপান্তর করুন:

আর- তে ডেটা পরিষ্কারের জন্য একটি বিস্তৃত এবং সুসংগত পদ্ধতির উদাহরণ এবং সম্পাদনা এবং ডিডুকরেক্ট প্যাকেজগুলির উদাহরণ এবং ব্যবহারের পাশাপাশি আর-তে ডেটা পরিষ্কারের ওয়ার্কফ্লো ( কাঠামো ) বর্ণনা সহ নিম্নলিখিত কাগজে উপস্থাপন করা হয়েছে, যা আমি অত্যন্ত সুপারিশ করছি: http : //cran.r-project.org/doc/contrib/de_Jonge+van_der_Loo- ভূমিকা_ থেকে_ডাটা_চলাচল_ও_আর.পিডিএফ

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