2014-10-06 18 views
7

reshape2 ve data.table için yeni ve sözdizimini öğrenmeye çalışıyorum.R, dcast.data.table tarafından yaratılan sütunların isimlerini özelleştirin

data.table, gruplama değişken (ler) i başına birden çok satırdan, her gruplama değişkeni (değişkenleri) için bir sıraya dönüştürmek istediğim bir var. Basitlik için, bir kısmı müşterileri paylaşan bir müşteri tablosu yapalım.

# 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 

Ben cust_1 ... cust_n n adresi başına maksimum müşterileri olduğu için sütunlar istiyorum:

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

Ben çıkış biçimi aşağıdaki gibi istiyorum. Siparişi gerçekten umursamıyorum - Joe cust_1 ve Betty cust_2 ya da tam tersi. Ben paste0 "cust_" öneki zorunda

cevap

9

Just pushed a commitdata.table v1.9.5 için. dcast şimdi

  • katına üzerine value.var sütun ve birden fun.aggregate fonksiyonları döküm verir
  • tanımsız anlayan değişkenler/formüldeki ifadeler Bununla

, yapabileceğimiz:

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

Güzel, 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 

Not. Bu adımı eklemeden önce, clunkier (ama muhtemelen daha hızlı) bir çözüm gibi görünen setnames(y, names(y), sub("(\\d+)","cust_\\1",names(y))) kullanıyordum.

Önekleme yapmak için daha iyi bir yol olup olmadığını merak ediyorum.


Alternatif olarak, sadece referans tarafından custdoğrudan sütun eklemek olabilir:

# 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

Ben ettik çok benzer bir sürüm ekledi, ancak ilk adımdan kaçınmamız gerekirse harika olacağını kabul ediyorum. Lütfen bir sorun bildirir misiniz? (Https://github.com/Rdatatable/data.table)? Teşekkürler. – Arun

+1

@Arun Tamam, teşekkürler, dosyalanmış. – C8H10N4O2