2014-10-22 2 views
3

У меня есть таблица данных с идентификатором ключа и столбцом с текстовым значением. Идентификатор ключа не уникален (некоторые строки имеют один и тот же идентификатор, может быть от 1 до 8 строк с одним и тем же идентификатором). Мне нужна таблица данных с уникальным идентификатором ключа и 8 столбцами.R специальная переформатировка таблиц данных

Например, Что у меня есть:

require(data.table) 
set.seed(1) 
out<-data.table(id=c(rep("id1",3),rep("id2",2),"id3"),value=paste("value",round(rnorm(6,0,100)))) 
out 
#  id  value 
# 1: id1 value 49 
# 2: id1 value 74 
# 3: id1 value 58 
# 4: id2 value -31 
# 5: id2 value 151 
# 6: id3 value 39 

Желаемый результат:

data.table(id=c("id1","id2","id3"),value1=c("value -63","value 160","value -82"),value2=c("value 18","value 33",NA),value3=c("value -84",NA,NA)) 
# id value1 value2 value3 
#1: id1 value -63 value 18 value -84 
#2: id2 value 160 value 33  NA 
#3: id3 value -82  NA  NA 
+1

(+1) Очень хороший вопрос для новичка , Я хочу, чтобы все новички были похожи на вас ... –

ответ

0

Считаете ли вы aggregate:

aggregate(value~id,data=out,FUN=paste,collapse=" ") 

id      value 
1 id1 value -63 value 18 value -84 
2 id2   value 160 value 33 
3 id3     value -82 

Это не совпадает с нужной продукции, но делает трюк в любом случае.

+0

Обратите внимание, что вы можете изменить разделитель, добавив символ в параметр 'collapse'. –

+0

Вы случайно заметили, что это вопрос 'data.table'? Почему он должен использовать «совокупность»? Он может сделать то же самое с 'data.table', например' out [, paste (value, collapse = ""), by = id] ', но не достигает желаемого вывода в любом случае –

+0

То, что я не знал , Угадайте, что вы каждый день узнаете что-то новое. –

4

Вы можете попробовать: (setnames часть пополняемая @David Arenburg)

res <- setnames(dcast.data.table(out[, N:=1:.N,by=id], id~N, value.var="value"), 
                2:4, paste0("value", 1:3)) 
res 
#  id value1 value2  value3 
# 1: id1 value -63 value 18 value -84 
# 2: id2 value 160 value 33  NA 
# 3: id3 value -82  NA  NA 

Или компактная версия предложена @David Arenburg

dcast.data.table(out[, N := paste0('value', 1:.N), by = id], 
            id ~ N, value.var = "value") 
+0

Nice one really –

+0

@David Arenburg Спасибо за редактирование. Думаю, мне нужно использовать 'setnames' для получения правильных имен. – akrun

+1

Я не думаю, что это так важно, может сделать что-то вроде 'res <- setnames (dcast.data.table (out [, N: = 1: .N, by = id], id ~ N, value.var = "value"), 2: 4, paste0 ("value", 1: 3)) ' –

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