2013-08-16 2 views
0

Есть простой способ, чтобы изменить этоReshape г dataframe в широкоэкранный формат

id date 
A Jan 2012 
B Jan 2012 
C Jan 2012 
A Feb 2012 
B Feb 2012 
A Mar 2012 
B MAr 2012 

в

id Jan 2012 Feb 2012 Mar 2012 
A T   T   T 
B T   T   T 
C T   F   F 

dcast и reshape требует агрегатной функции, что я не думаю, что мне нужно (?)

+4

Um. 'table (mydf)' где ваш объект называется mydf? – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto +1 Я добавил это в - но вы имеете в виду 'table (mydf)> 0'? –

+0

@ SimonO101, 'TRUE' оценивает« 1 »и« FALSE »до« 0 », поэтому я не думаю, что это абсолютно необходимо. – A5C1D2H2I1M1N2O1R2T1

ответ

3

Использование dcast как вы предлагаете ...

# Please provide reproducible data next time! 
set.seed(123) 
dt <- data.frame(id = rep(c("A","B","C"),3), date = sample(month.name[1:3] , 9 , repl = TRUE) , stringsAsFactors = FALSE) 
# id  date 
#1 A January 
#2 B March 
#3 C February 
#4 A March 
#5 B March 
#6 C January 
#7 A February 
#8 B March 
#9 C February 

require(reshape2) 
dcast(dt , id ~ date , fun = function(x) length(x) > 0 , fill = FALSE) 
# id February January March 
#1 A  TRUE TRUE TRUE 
#2 B FALSE FALSE TRUE 
#3 C  TRUE TRUE FALSE 

Или просто table как @AnandaMahto suggets ...

table(dt) > 0 
# date 
#id February January March 
# A  TRUE TRUE TRUE 
# B FALSE FALSE TRUE 
# C  TRUE TRUE FALSE 

Что certianly синтаксически проще !!

+0

с 'dcast' говорит' использование столбца даты как значения: используйте values.var для переопределения', а затем подавляет! это третий раз подряд ... – nigmastar

+0

@nigmastar, насколько велики ваши данные и сколько комбинаций есть? –

+0

- это 'data.table' из примерно 6.5M строк и 400K уникальных идентификаторов. Но это один из самых маленьких. Я, вероятно, слишком привык к 'data.table', что любой другой пакет кажется теперь дерьмовым :-) – nigmastar

2

Я думаю, что это будет работать большое за то, что вы ищете:

library(zoo) 
df <- data.frame(id = c("A", "B", "C", "A", "B", "A", "B"), date = c("2012-01", "2012-01", "2012-01", "2012-02", "2012-02", "2012-03", "2012-03")) 
df$date <- as.yearmon(df$date) 

result <- with(df, tapply(date, list(id, date), length)) 
result[is.na(result)] <- 0 
result <- (result == 1) 

Вы получаете:

Jan 2012 Feb 2012 Mar 2012 
A  TRUE  TRUE  TRUE 
B  TRUE  TRUE  TRUE 
C  TRUE FALSE FALSE 
+0

Нет 'reshape', no' dcast'! – Mayou

+0

Спасибо. Я использую зоопарк для своего класса yearmon, но я должен избавиться от него, потому что это смехотворно медленно с «большими» данными. – nigmastar

+0

@nigmastar Библиотека 'zoo' здесь просто использовалась для форматирования моего тестового dataframe, чтобы он выглядел как ваш. Другие строки кода не требуют 'zoo' – Mayou

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