2014-10-06 19 views
7

Sono nuovo a reshape2 e data.table e cercando di imparare la sintassi.in R, personalizzare i nomi delle colonne create da dcast.data.table

Ho un data.table che voglio eseguire il cast da più righe per ogni variabile di raggruppamento su una riga per ogni variabile di raggruppamento. Per semplicità, trasformiamolo in una tabella di clienti, alcuni dei quali condividono gli indirizzi.

library(data.table) 

# Input table: 
cust <- data.table(name=c("Betty","Joe","Frank","Wendy","Sally"), 
        address=c(rep("123 Sunny Rd",2), 
          rep("456 Cloudy Ln",2), 
           "789 Windy Dr")) 

voglio l'uscita di avere il seguente formato:

# Desired output looks like this: 
(out <- data.table(address=c("123 Sunny Rd","456 Cloudy Ln","789 Windy Dr"), 
        cust_1=c("Betty","Frank","Sally"), 
        cust_2=c("Joe","Wendy",NA))) 

#   address cust_1 cust_2 
# 1: 123 Sunny Rd Betty Joe 
# 2: 456 Cloudy Ln Frank Wendy 
# 3: 789 Windy Dr Sally  NA 

Vorrei colonne per cust_1 ... cust_n dove n è il cliente massimo per ogni indirizzo. Non mi interessa davvero l'ordine - se Joe è cust_1 e Betty è cust_2 o viceversa.

risposta

9

Just pushed a commit a data.table v1.9.5. dcast ora

  • possibile colare su più value.var colonne e molteplici funzioni fun.aggregate
  • capisono undefined variabili/espressioni nella formula

Con questo, si può fare:

dcast(cust, address ~ paste0("cust", cust[, seq_len(.N), 
      by=address]$V1), value.var="name") 
#   address cust1 cust2 
# 1: 123 Sunny Rd Betty Joe 
# 2: 456 Cloudy Ln Frank Wendy 
# 3: 789 Windy Dr Sally NA 
+1

Bello, TYVM – C8H10N4O2

4
# My attempt: 
setkey(cust,address) 
x <- cust[,list(name, addr_cust_num=rank(name,ties.method="random")), by=address]) 
x[,addr_cust_num:=paste0("cust_",addr_cust_num)] 
y <- dcast.data.table(x, address ~ addr_cust_num, value.var="name") 
y 

Nota che ho dovuto paste0 il prefisso "cust_". Prima di aggiungere questo passaggio, stavo usando setnames(y, names(y), sub("(\\d+)","cust_\\1",names(y))) che sembrava una soluzione più clunkier (ma probabilmente più veloce).

Chiedersi se esiste un modo migliore per eseguire il prefisso.


In alternativa, si può solo aggiungere la colonna direttamente a custcon riferimento:

# no need to set key 
cust[, cust := paste("cust", seq_len(.N), sep="_"), by=address] 
dcast.data.table(cust, address ~ cust, value.var="name") 
#   address cust_1 cust_2 
# 1: 123 Sunny Rd Betty Joe 
# 2: 456 Cloudy Ln Frank Wendy 
# 3: 789 Windy Dr Sally  NA 
+1

ho ha aggiunto una versione molto simile, ma sono d'accordo che sarebbe bello se potessimo evitare il primo passo. Potresti per favore presentare un problema [qui] (https://github.com/Rdatatable/data.table)? Grazie. – Arun

+1

@Arun OK, grazie, archiviato. – C8H10N4O2

Problemi correlati