2015-06-06 9 views
5

Ho un set di dati con dati accoppiati (membri della stessa famiglia).Colonna aggiuntiva basata su dati accoppiati (mutati)

Id è l'identificatore individuale e householdid è l'identificatore del partner (e viceversa).

Quello che mi serve è aggiungere una colonna in più (l'occupazione) per ogni id del suo partner.

I miei dati simile a questa

dta = rbind(c(1013661,101366, 'Never worked'), 
    c(1013662, 101366, 'Intermediate occs'), 
    c(1037552, 103755, 'Managerial & professional occs'), 
    c(1037551, 103755, 'Intermediate occs') 
) 

colnames(dta) = c('idno', 'householdid', 'occup') 
dta 

idno  householdid occup       
"1013661" "101366" "Never worked"     
"1013662" "101366" "Intermediate occs"    
"1037552" "103755" "Managerial & professional occs" 
"1037551" "103755" "Intermediate occs" 

Che cosa ho bisogno dovrebbe assomigliare a questo

idno  householdid occup       occupPartner      
"1013661" "101366" "Never worked"     "Intermediate occs"    
"1013662" "101366" "Intermediate occs"    "Never worked"     
"1037552" "103755" "Managerial & professional occs" "Intermediate occs"    
"1037551" "103755" "Intermediate occs"    "Managerial & professional occs" 

Credo che ci sia una soluzione con mutare, ma non sono sicuro di quello che il group_by dovrebbe essere.

Qualche idea?

risposta

8

Prova

library(dplyr) 
dta1 <- as.data.frame(dta) %>% 
      group_by(householdid) %>% 
      mutate(occupPartner= rev(occup)) 
as.data.frame(dta1) 
#  idno householdid       occup 
#1 1013661  101366     Never worked 
#2 1013662  101366    Intermediate occs 
#3 1037552  103755 Managerial & professional occs 
#4 1037551  103755    Intermediate occs 
#     occupPartner 
#1    Intermediate occs 
#2     Never worked 
#3    Intermediate occs 
#4 Managerial & professional occs 

Se i dati sono già ordinata,

indx <- c(rbind(seq(2, nrow(dta), by=2), seq(1, nrow(dta), by=2))) 
cbind(dta, occupPartner=dta[,3][indx]) 
+1

brillante brillante brillante – giacomo

+1

@giacomoV Felice di sapere che ha funzionato per voi . – akrun

2

Un'altra opzione utilizzando data.table

library(data.table) 
out = as.data.table(dta)[, occupPartner := rev(occup), by = householdid] 

#> out 
#  idno householdid       occup 
#1: 1013661  101366     Never worked 
#2: 1013662  101366    Intermediate occs 
#3: 1037552  103755 Managerial & professional occs 
#4: 1037551  103755    Intermediate occs 
#      occupPartner 
#1:    Intermediate occs 
#2:     Never worked 
#3:    Intermediate occs 
#4: Managerial & professional occs 
+0

se si desidera utilizzare 'data.table's, quindi usare' setDT() 'è un'opzione migliore rispetto a dover copiare i dati inutilmente usando' as.data.table() '. – Arun

+1

In realtà ho usato 'as.data.table()' perché i dati di input sono una matrice. –

+0

whoops .. giusto, totalmente mancato. – Arun

Problemi correlati