2012-06-01 3 views
0

Я ищу «элегантный» способ в основном разделить кадр данных по уровням одной переменной столбца, а затем создать новый выходной кадр данных, преобразованный, чтобы теперь сбросить переменную фактора и добавить новые столбцы для уровней факторной переменной , Я могу сделать это с помощью таких функций, как метод split(), но это кажется мне грязным способом. Я пытался сделать это, используя функции melt() и cast() в пакете plyr, но не добился успеха в получении точного результата, который мне нужен.Как создать новые столбцы фрейма данных, соответствующие уровням данного столбца, используя пакет plyr в R?

Вот что выглядит мои данные, как:

> jumbo.df = read.csv(...) 
> head(jumbo.df) 
     PricingDate Name  Rate 
    186 2012-03-05 Type A 2.875 
    187 2012-03-05 Type B 3.250 
    188 2012-03-05 Type C 3.750 
    189 2012-03-05 Type D 3.750 
    190 2012-03-05 Type E 4.500 
    191 2012-03-06 Type A 2.875 

То, что я хотел бы сделать, это разделить переменной имя, удалить Имя и Rate, затем выходные столбцы для типа А, Тип B, Тип C, Тип D и Тип E с соответствующей скоростью серии с Дата ID:

> head(output.df) 
     PricingDate Type A Type B Type C Type D Type E 
     2012-03-05 2.875 3.250  3.750  3.750  4.500 
     2012-03-06 2.875 ... 

Спасибо!

+0

Ваш пример не имеет смысла. Если вы разделяете «Имя», то как на земле вы получаете все имена для каждой даты на выходе? Если вы разделите «Имя», тогда все «Тип A» будут одним объектом и так далее. Возможно, вы имеете в виду разделение на «PricingDate»? – Maiasaura

ответ

4

Не уверен, что я прав, но может быть, вы просто хотите изменить свои данные в широком формате? Если это так, вы должны использовать функции melt и cast пакета reshape (!). reshape2 в основном то же самое. Поскольку ваши данные уже находятся в расплавленном виде, то есть в длинном формате, один вкладыш делает то, что вы хотите:

df <- read.table(textConnection("PricingDate Name  Rate 
           2012-03-05 TypeA 2.875 
           2012-03-05 TypeB 3.250 
           2012-03-05 TypeC 3.750 
           2012-03-05 TypeD 3.750 
           2012-03-05 TypeE 4.500 
           2012-03-06 TypeA 2.875"), header=TRUE, row.names=NULL) 
library(reshape2) 
dcast(df, PricingDate ~ Name) 
Using Rate as value column: use value.var to override. 
    PricingDate TypeA TypeB TypeC TypeD TypeE 
1 2012-03-05 2.875 3.25 3.75 3.75 4.5 
2 2012-03-06 2.875 NA NA NA NA 
+0

Отлично, спасибо! –

1
library(plyr) 
library(reshape2) 

    data <- structure(list(PricingDate = c("2012-03-05", "2012-03-05", "2012-03-05", 
    "2012-03-05", "2012-03-05", "2012-03-06", "2012-03-06", "2012-03-06", 
    "2012-03-06", "2012-03-06"), Name = c("Type A", "Type B", "Type C", 
    "Type D", "Type E", "Type A", "Type B", "Type C", "Type D", "Type E" 
    ), Rate = c(2.875, 3.25, 3.75, 3.75, 4.5, 4.875, 5.25, 6.75, 
    7.75, 8.5)), .Names = c("PricingDate", "Name", "Rate"), class = "data.frame", row.names = c("186", 
    "187", "188", "189", "190", "191", "192", "193", "194", "195" 
    )) 


    > data 
     PricingDate Name Rate 
    186 2012-03-05 Type A 2.875 
    187 2012-03-05 Type B 3.250 
    188 2012-03-05 Type C 3.750 
    189 2012-03-05 Type D 3.750 
    190 2012-03-05 Type E 4.500 
    191 2012-03-06 Type A 4.875 
    192 2012-03-06 Type B 5.250 
    193 2012-03-06 Type C 6.750 
    194 2012-03-06 Type D 7.750 
    195 2012-03-06 Type E 8.500 


    ddply(data, .(PricingDate), function(x) reshape(x, idvar="PricingDate", timevar="Name", direction="wide")) 



    PricingDate Rate.Type A Rate.Type B Rate.Type C Rate.Type D 
    1 2012-03-05  2.875  3.25  3.75  3.75 
    2 2012-03-06  4.875  5.25  6.75  7.75 
     Rate.Type E 
    1   4.5 
    2   8.5