यह मेरा पहला पोस्ट है। अगर मैं किसी भी प्रक्रिया का उल्लंघन करता हूं या ऐसा करता हूं तो कृपया मुझे बताएं और मैं तदनुसार खुद को सुधारूंगा। मैं आर के लिए अपेक्षाकृत नया हूं, इसलिए मैं लगातार इस पर किताबें पढ़ रहा हूं और इस मुद्दे को हल करने में सक्षम नहीं हूं।

मेरे पास कई डेटा फ़्रेम हैं जिन्हें मैं संयोजित करने पर काम कर रहा हूं। बहुत सारे कर्मचारी डेटा हैं। मैं प्रत्येक व्यक्ति के बारे में हमारे सभी डेटा के साथ एक मास्टर डेटा फ्रेम बनाने के लिए तैयार हूं (प्रत्येक पंक्ति एक कर्मचारी पर सभी जानकारी है)। हमारे डेटा फ़्रेमों में से एक के लिए यह पहले से ही इस तरह से सेट है।

हमारी एचआर फाइल से बड़ी समस्या होती है। हर बार एचआर "इवेंट" होने पर हमारे पास एक प्रविष्टि होती है। तो आपको एक वेतन मिलता है, आप विभागों को स्थानांतरित करते हैं, एक डेटा सुधार, आदि। एक बुनियादी विचार देने के लिए यह इस तरह दिखता है:

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
1
Xanman 6 अगस्त 2017, 02:12

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")
1
Community 20 जून 2020, 12:12

नीचे दिए गए नोट में परिभाषित इनपुट का उपयोग करते हुए, 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)
2
G. Grothendieck 6 अगस्त 2017, 02:51

आपका डेटा

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
2
CPak 6 अगस्त 2017, 03:46