2012-06-01 3 views
0

기본적으로 데이터 프레임을 하나의 열 변수로 나누는 "우아한"방법을 찾고, 새로운 출력 데이터 프레임을 작성하여 이제는 요소 변수를 삭제하고 요소 변수의 수준에 대한 새 열을 추가합니다. . split() 메서드와 같은 함수를 사용하여이 작업을 수행 할 수 있지만 이것은 나에게 지저분한 방법 인 것 같습니다. 필자는 plyr 패키지의 melt() 및 cast() 함수를 사용하여이 작업을 수행하려했지만 필요한 정확한 출력을 얻지 못했습니다. 여기 R의 plyr 패키지를 사용하여 주어진 열의 레벨에 해당하는 새로운 데이터 프레임 열을 어떻게 만들 수 있습니까?

내 데이터가 모습입니다 같은 : 나는 유형 A에 대한 비율, 다음 출력 열을 변수 이름으로 분할 할 이름을 제거하려는 어떤

> 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 

, 타입 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

귀하의 예는 이해되지 않는다. 'Name'으로 나눈다면, 출력에서 ​​각 날짜의 모든 이름을 어떻게 얻을 수 있습니까? 'Name'으로 나눈다면'Type A'는 하나의 객체가 될 것입니다. 아마도 당신은'PricingDate'로 갈라 지겠습니까? – Maiasaura

답변

4

내가 제대로 할 수 있는지 확실하지 않지만 데이터를 와이드 형식으로 바꾸고 싶을 수 있습니까? 그렇다면 (!) 패키지의 meltcast 기능을 사용해야합니다. 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 
관련 문제