2014-10-06 2 views
7

Я новичок в reshape2 и data.table и пытается изучить синтаксис.в R, настроить имена столбцов, созданных dcast.data.table

У меня есть data.table, который я хочу использовать из нескольких строк для каждой переменной (ов) группы в одну строку для каждой переменной (ов) группировки. Для простоты сделаем это таблицей клиентов, некоторые из которых разделяют адреса.

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

Я хочу, чтобы на выходе иметь следующий формат:

# 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 

Я хотел бы колонки для cust_1 ... cust_n где п максимального количества клиентов на адрес. Я не очень-то забочусь о том, что Джо - cust_1, а Бетти - cust_2 или наоборот.

ответ

9

Just pushed a commit к data.table v1.9.5. dcast Теперь

  • позволяет кастинг на нескольких value.var столбцов и несколько fun.aggregate функции
  • понимает неопределенные переменные/выражения в формуле

С этим, мы можем сделать:

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

Красивые, 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 

Обратите внимание, что я должен был paste0 "cust_" приставкой. Прежде чем я добавил этот шаг, я использовал setnames(y, names(y), sub("(\\d+)","cust_\\1",names(y))), который казался clunkier (но, вероятно, быстрее).

Удивительно, если есть лучший способ сделать префикс.


В качестве альтернативы, вы можете просто добавить колонку непосредственно custпо ссылке:

# 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

Я добавила очень похожую версию, но я согласен, что было бы здорово, если бы мы могли избежать первого шага. Не могли бы вы указать проблему [здесь] (https://github.com/Rdatatable/data.table)? Благодарю. – Arun

+1

@Arun ОК, спасибо, подано. – C8H10N4O2

Смежные вопросы