यह मेरा पहला पोस्ट है। अगर मैं किसी भी प्रक्रिया का उल्लंघन करता हूं या ऐसा करता हूं तो कृपया मुझे बताएं और मैं तदनुसार खुद को सुधारूंगा। मैं आर के लिए अपेक्षाकृत नया हूं, इसलिए मैं लगातार इस पर किताबें पढ़ रहा हूं और इस मुद्दे को हल करने में सक्षम नहीं हूं।
मेरे पास कई डेटा फ़्रेम हैं जिन्हें मैं संयोजित करने पर काम कर रहा हूं। बहुत सारे कर्मचारी डेटा हैं। मैं प्रत्येक व्यक्ति के बारे में हमारे सभी डेटा के साथ एक मास्टर डेटा फ्रेम बनाने के लिए तैयार हूं (प्रत्येक पंक्ति एक कर्मचारी पर सभी जानकारी है)। हमारे डेटा फ़्रेमों में से एक के लिए यह पहले से ही इस तरह से सेट है।
हमारी एचआर फाइल से बड़ी समस्या होती है। हर बार एचआर "इवेंट" होने पर हमारे पास एक प्रविष्टि होती है। तो आपको एक वेतन मिलता है, आप विभागों को स्थानांतरित करते हैं, एक डेटा सुधार, आदि। एक बुनियादी विचार देने के लिए यह इस तरह दिखता है:
Employee ID Event
1 Pay Raise
1 Promotion
1 Transfer
2 Data Cor
3 Raise
3 New Sup
मैं इसे एक डेटा फ्रेम के साथ जोड़ना चाहता हूं जो इस तरह दिखता है
`Employee ID Hire Date Salary
1 1/2/06 50000
2 4/6/15 100000
3 7/23/97 120000`
मैं मिलान करने के लिए कर्मचारी आईडी का उपयोग करके अंत में कॉलम जोड़ना चाहता हूं। तो मूल रूप से यह अपेक्षित परिणाम है:
Employee ID Hire Date Salary Event 1 Event 2 Event 3
1 1/2/06 50000 Raise Promotion Transfer
2 4/6/15 100000 Data Cor NA NA
3 7/23/97 120000 Raise New Sup NA
3 जवाब
अपेक्षित परिणाम के लिए दो ऑपरेशनों की आवश्यकता होती है:
- इवेंट फ़ाइल को लंबे से चौड़े प्रारूप में फिर से आकार दें
- एचआर फ़ाइल से अन्य कर्मचारी आधार डेटा के साथ जुड़ें
इसे data.table
का उपयोग करके "वन-लाइनर" में प्राप्त किया जा सकता है:
library(data.table) # CRAN version 1.10.4 used
dcast(setDT(events), Employee_ID ~ paste0("Event_", rowid(Employee_ID)))[
setDT(employees), on = "Employee_ID"]
Employee_ID Event_1 Event_2 Event_3 Hire_Date Salary 1: 1 Pay Raise Promotion Transfer 1/2/06 50000 2: 2 Data Cor NA NA 4/6/15 100000 3: 3 Raise New Sup NA 7/23/97 120000 4: 4 NA NA NA 1/8/17 40000
ध्यान दें कि मैंने जानबूझकर चौथे कर्मचारी को उस स्थिति का अनुकरण करने के लिए जोड़ा है जहां किसी कर्मचारी के लिए अभी तक कोई घटना दर्ज नहीं की गई है।
जैसा कि ओपी ने अंत में कॉलम जोड़ने का अनुरोध किया है, setcolorder()
का उपयोग स्थान पर कॉलम क्रम को बदलने के लिए किया जाता है जो संपूर्ण डेटा ऑब्जेक्ट की प्रतिलिपि बनाने से बचता है:
dcast(setDT(events), Employee_ID ~ paste0("Event_", rowid(Employee_ID)))[
setDT(employees), on = "Employee_ID"][
, setcolorder(.SD, c(names(employees), setdiff(names(.SD), names(employees))))]
Employee_ID Hire_Date Salary Event_1 Event_2 Event_3 1: 1 1/2/06 50000 Pay Raise Promotion Transfer 2: 2 4/6/15 100000 Data Cor NA NA 3: 3 7/23/97 120000 Raise New Sup NA 4: 4 1/8/17 40000 NA NA NA
पूर्णता के लिए, यहां एक कम कुशल विकल्प है जहां जॉइन किया जाता है पहले लॉन्ग से वाइड फ़ॉर्मेट में फिर से आकार देना:
setDT(events)[setDT(employees), on = "Employee_ID"][
, dcast(.SD, Employee_ID + ... ~ paste0("Event_", rowid(Employee_ID)),
value.var = "Event")]
Employee_ID Hire_Date Salary Event_1 Event_2 Event_3 1: 1 1/2/06 50000 Pay Raise Promotion Transfer 2: 2 4/6/15 100000 Data Cor NA NA 3: 3 7/23/97 120000 Raise New Sup NA 4: 4 1/8/17 40000 NA NA NA
यद्यपि इसके लिए कोडिंग के मामले में कम प्रयास की आवश्यकता होती है क्योंकि कॉलम setcolorder()
को अतिरिक्त कॉल किए बिना अपेक्षित क्रम में वापस आ जाते हैं, यह स्मृति खपत और गति के मामले में कम कुशल होने की संभावना है यदि employee
में कई हैं स्तंभ। ओपी ने उल्लेख किया है कि प्रत्येक पंक्ति सभी एक कर्मचारी की जानकारी है (जोर मेरा)।
आंकड़े
events <- readr::read_table(
"Employee_ID Event
1 Pay Raise
1 Promotion
1 Transfer
2 Data Cor
3 Raise
3 New Sup")
employees <- readr::read_table(
"Employee_ID Hire_Date Salary
1 1/2/06 50000
2 4/6/15 100000
3 7/23/97 120000
4 1/8/17 40000")
नीचे दिए गए नोट में परिभाषित इनपुट का उपयोग करते हुए, Seq
को परिभाषित करें, जो DF1
में एक कर्मचारी की पहली पंक्ति के लिए "इवेंट 1" है, दूसरे के लिए "इवेंट 2" और इसी तरह। फिर Seq
का उपयोग करके DF1
को लंबे रूप से विस्तृत रूप में बदलने के लिए tapply
का उपयोग करें। किसी भी खाली स्ट्रिंग को NA से बदलें और फिर उसे DF1
में मिला दें। कोई पैकेज उपयोग नहीं किया जाता है।
Seq <- paste("Event", ave(1:nrow(DF1), DF1$"Employee ID", FUN = seq_along))
wide <- with(DF1, tapply(Event, list(`Employee ID`, Seq), c))
wide[wide == ""] <- NA
merge(DF2, wide, by.x = 1, by.y = 0, all.x = TRUE)
देना:
Employee ID Hire Date Salary Event 1 Event 2 Event 3
1 Emp1 1/2/06 50000 Pay Raise Promotion Transfer
2 Emp2 4/6/15 100000 Data Cor <NA> <NA>
3 Emp3 7/23/97 120000 Raise New Sup <NA>
नोट: प्रतिलिपि प्रस्तुत करने योग्य रूप में इनपुट हैं:
Lines1 <- "
Employee ID,Event
Emp1,Pay Raise
Emp1,Promotion
Emp1,Transfer
Emp2,Data Cor
Emp3,Raise
Emp3,New Sup"
DF1 <- read.csv(text = Lines1, check.names = FALSE, as.is = TRUE)
Lines2 <- "
Employee ID,Hire Date,Salary
Emp1,1/2/06,50000
Emp2,4/6/15,100000
Emp3,7/23/97,120000"
DF2 <- read.csv(text = Lines2, as.is = TRUE, check.names = FALSE)
आपका डेटा
library(data.table)
DF1 <- fread("Employee_ID,Event
1,Pay Raise
1,Promotion
1,Transfer
2,Data Cor
3,Raise
3,New Sup", header=T, sep=",")
DF2 <- fread("Employee_ID,Hire_Date,Salary
1,1/2/06,50000
2,4/6/15,100000
3,7/23/97,120000", header=T, sep=",")
Dplyr और tidyr समाधान
library(dplyr)
library(tidyr)
result <- DF1 %>%
group_by(Employee_ID) %>%
summarise(dummy=paste0(Event,collapse=",")) %>%
separate(dummy, into=c("Event_1","Event_2","Event_3"), sep=",", extra="drop", fill="right") %>%
left_join(., DF2, by="Employee_ID")
उत्पादन
Employee_ID Event_1 Event_2 Event_3 Hire_Date Salary
1 1 Pay Raise Promotion Transfer 1/2/06 50000
2 2 Data Cor <NA> <NA> 4/6/15 100000
3 3 Raise New Sup <NA> 7/23/97 120000