2013-08-25 3 views
1

Ниже приведен пример моего набора данныхПерестройка кадр данных с помощью настраиваемого техники

df1<- read.table(text=" Month Crime 
2010-12 Anti-social-behaviour 
2010-12 Anti-social-behaviour 
2010-12 Anti-social-behaviour 
2010-12 Robbery 
2010-12 Robbery 
2010-12 Violent-Crime 
2010-12 Violent-Crime 
2010-12 Theft 
2011-01 Anti-social-behaviour 
2011-01 Anti-social-behaviour 
2011-01 Anti-social-behaviour 
2011-01 Anti-social-behaviour 
2011-01 Arson 
2011-01 Arson 
2011-01 Theft 
2011-01 Theft 
2011-01 Theft 
2011-01 Theft 
2011-01 Theft", header=TRUE) 

Я намеревался превратить его в следующем формате, чтобы иметь возможность анализировать ее.

Month  Crime     Frequency 
2010-12 Anti-social-behaviour 3 
2010-12 Robbery     2 
2010-12 Violent Crime   2 
2010-12 Theft     1 
2011-01 Anti-social behaviour 4 
2011-01 Arson     2 
2011-01 Theft     5 

Поскольку я не был знаком с пакетами перекроить, и я хотел, чтобы обучить себя на использовании базовых функций, я сформулировал свой собственный подход:

#convert months to factor 
crimeData3$Month<- factor(crimeData3$Month, ordered=TRUE) 
#calculate instances of each factor level 
instances<- table(crimeData3$Month) 
mySeq<- numeric(0) 
myseqFinal<- numeric(0) 
#append letters to each crime for each factor level, to identify crimes at month-level 
for (i in 1:length(instances)){ 
mySeq<- rep(LETTERS[i], times=instances[i]) 
myseqFinal<- c(myseqFinal,mySeq) 
} 
crimeData3$CrimeNew<- paste(crimeData3$Crime, myseqFinal, sep=" ") 
crimeData3$CrimeNew<- factor(crimeData3$CrimeNew, ordered=TRUE) 

То, что я надеялся сделать после того, как это было рассчитать частоту каждого преступления. Поскольку все преступления были однозначно отмечены на уровне месяца, я подумал, что будет легко рассчитать частоту и просто добавить результаты в том же порядке к новому кадру данных.

Однако, как только я применяю функцию таблицы к crimeData3 $ Crime, порядок совершения преступления перепутался.

Есть ли другой, более простой подход? Может ли мой код манипулировать, чтобы обеспечить решение? Я был бы признателен за любую помощь, используя базовые функции, а также специализированные.

Большое спасибо.

+1

Возможно, вы ищете 'данные .frame (таблица (df1)) '? – A5C1D2H2I1M1N2O1R2T1

+0

Ой! Как элегантно! Я бы никогда об этом не думал; Я использовал только таблицу для отдельных столбцов/строк! –

+0

Если у вас есть какая-либо критика/совет/комментарий, чтобы добавить о моем коде тоже, это было бы от вас. –

ответ

2

Ваше мнение не было слишком далеко. Следующим шагом будет aggregate ваш выход. Рассмотрим следующий пример:

aggregate(CrimeNew ~ Month + Crime, crimeData3, length) 
#  Month     Crime CrimeNew 
# 1 2010-12 Anti-social-behaviour  3 
# 2 2011-01 Anti-social-behaviour  4 
# 3 2011-01     Arson  2 
# 4 2010-12    Robbery  2 
# 5 2010-12     Theft  1 
# 6 2011-01     Theft  5 
# 7 2010-12   Violent-Crime  2 

Как улучшения кода, нет необходимости в петле for:

myseqFinal <- rep(LETTERS[seq_along(instances)], times = instances) 

Однако, как уже упоминалось в комментариях, вы можете просто использовать table на два столбца ваших данных и оберните это в data.frame. Поскольку вы, похоже, обеспокоены порядком ваших строк и исключением отсутствующих значений, я добавил еще несколько строк, чтобы показать, как добраться до нужного вам результата:

out <- data.frame(table(df1)) 
out <- out[order(factor(out$Month, ordered = TRUE)), ] 
#  Month     Crime Freq 
# 1 2010-12 Anti-social-behaviour 3 
# 5 2010-12    Robbery 2 
# 7 2010-12     Theft 1 
# 9 2010-12   Violent-Crime 2 
# 2 2011-01 Anti-social-behaviour 4 
# 4 2011-01     Arson 2 
# 8 2011-01     Theft 5 
+0

Я действительно ликующий! Большое вам спасибо за то, что вы просветили меня на столе + о функции, которую я написал! –

+0

@info_seekeR, без проблем :) – A5C1D2H2I1M1N2O1R2T1

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