2014-10-06 10 views
7

Jestem nowy w reshape2 i data.table i próbuję uczyć się składni.w R, dostosuj nazwy kolumn utworzonych przez dcast.data.table

Mam data.table, który chcę rzutować z wielu wierszy na zmienne grupujące do jednego wiersza na zmienne grupujące. Dla uproszczenia stwórzmy tabelę klientów, z których część udostępnia adresy.

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")) 

Chcę wyjście mieć następujący format:

# 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 

chciałbym kolumny cust_1 ... cust_n gdzie n oznacza liczbę klientów maksymalnie na adres. Nie bardzo zależy mi na zamówieniu - czy Joe jest cust_1, a Betty to cust_2 lub odwrotnie.

Odpowiedz

9

Just pushed a commit do data.table v1.9.5. dcast teraz

  • pozwala odlewania na wielokrotność value.var kolumn i wielu fun.aggregate funkcje
  • rozumie niezdefiniowane zmienne/wyrażenia we wzorze

Z tego, co możemy zrobić:

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

Piękny, 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 

Zauważ, że musiałem paste0 W "cust_" prefix. Zanim dodałem ten krok, używałem setnames(y, names(y), sub("(\\d+)","cust_\\1",names(y))), który wydawał się być bardziej spójnym (ale prawdopodobnie szybszym) rozwiązaniem.

Zastanawiasz się, czy istnieje lepszy sposób na wykonanie prefiksu.


Alternatywnie, można po prostu dodać kolumnę bezpośrednio do custprzez odniesienie:

# 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

mam dodano bardzo podobną wersję, ale zgadzam się, że byłoby świetnie, gdybyśmy mogli uniknąć pierwszego kroku. Czy mógłbyś zgłosić problem [tutaj] (https://github.com/Rdatatable/data.table)? Dzięki. – Arun

+1

@Arun OK, dzięki, złożony. – C8H10N4O2