2014-09-16 3 views
2
내가 여기

강제 변환 열 열 요소의 이름과

set.seed(6) 
df <- data.frame(t = as.Date("2014/1/1")+seq(0,100.25,.25), 
    name = paste(sample(c("Alert_","NonOp_"),402,replace=TRUE), 
        sample(1:10,402,replace=TRUE),sep=""), 
    unit = c(rep(1:10,each=40),10,10)) 
head(df) 

같은 데이터가

채우는 몇 ​​가지 대표적인 데이터 테이블이 장치의 열이 이름에서 테이블을 생성하는 방법

head(df) 
      t  name unit 
1 2014-01-01 NonOp_3  1 
2 2014-01-01 NonOp_6  1 
3 2014-01-01 Alert_5  1 
4 2014-01-01 Alert_7  1 
5 2014-01-02 NonOp_4  1 
6 2014-01-02 NonOp_2  1 

입니다 , t 그리고 이름 열의 이름은 Alert/NonOp없이 이름을 가진 열로 강제 변환되며 열의 이름 열에있는 값은 NA, A (경고) 및 N (NonOp)이어야합니다. 여기에 모든 숫자는 위의 단위 인 경우에 내가 찾고 테이블의 유형은 1.

unit    t name_1 name_2 name_3 name_4 name_5 name_6 name_7 name_8 ... 
    1  2014-01-01  NA  NA  N  NA  A  A  A  NA 
    1  2014-01-02  NA  N  NA  N  NA  NA  NA  NA 

목표는 단위/t에 의해 주문 테이블에 명명 된 경고/nonops에이고 테이블을 쓰기 파일로. 그리고 파일을 Excel로 읽습니다.

+1

사용하시기 바랍니다 사용할 수 있습니다 'sample.'을 사용하여 예제 코드를 게시 할 때'set.seed' 명령을 사용하십시오. – A5C1D2H2I1M1N2O1R2T1

+0

또한'df <- ...'예제는'head (df)'에 표시 한 데이터를 생성하지 않습니다. –

+0

'reshape2'에서'dcast' 함수를 찾고 있다고 생각합니다. 보십시오'도서관 (reshape2); dcast (df, unit + t ~ name)' – maloneypatr

답변

4

그것은 은 다음과 같은 소리는 당신이 찾고있는 무엇 :

library(reshape2) 
newdf <- cbind(df, colsplit(df$name, "_", c("V1", "V2"))) 
newdf$V1 <- factor(newdf$V1, c("NonOp", "Alert"), c("N", "A")) 
newdf$V2 <- paste0("name_", newdf$V2) 
head(newdf) 
#   t name unit V1  V2 
# 1 2014-01-01 NonOp_3 1 N name_3 
# 2 2014-01-01 NonOp_6 1 N name_6 
# 3 2014-01-01 Alert_5 1 A name_5 
# 4 2014-01-01 Alert_7 1 A name_7 
# 5 2014-01-02 NonOp_4 1 N name_4 
# 6 2014-01-02 NonOp_2 1 N name_2 

head(dcast(newdf, t ~ V2, value.var = "V1")) 
#   t name_1 name_10 name_2 name_3 name_4 name_5 name_6 name_7 name_8 name_9 
# 1 2014-01-01 <NA> <NA> <NA>  N <NA> <NA> <NA> <NA> <NA> <NA> 
# 2 2014-01-01 <NA> <NA> <NA> <NA> <NA> <NA>  N <NA> <NA> <NA> 
# 3 2014-01-01 <NA> <NA> <NA> <NA> <NA>  A <NA> <NA> <NA> <NA> 
# 4 2014-01-01 <NA> <NA> <NA> <NA> <NA> <NA> <NA>  A <NA> <NA> 
# 5 2014-01-02 <NA> <NA> <NA> <NA>  N <NA> <NA> <NA> <NA> <NA> 
# 6 2014-01-02 <NA> <NA>  N <NA> <NA> <NA> <NA> <NA> <NA> <NA> 

는 기본적으로 두 개의 컬럼으로 "이름"열을 분할하여 시작하고 dcast를 사용합니다. 다른 단계는 대부분 미용입니다.


또 다른 방법은 "data.table"패키지에서 my cSplit functiondcast.data.table을 사용하는 것입니다.

그냥, 등등 "name_blah"를 만들고 "N"과 "NonOp"를 교체하고 같은 일을 할 수 건너 뛰기 직접 수행

dcast.data.table(cSplit(df, "name", "_"), t ~ name_2, value.var = "name_1") 
#    t  1 10  2  3  4  5  6  7 8 9 
# 1: 2014-01-01 NA NA NA NonOp NA NA NA NA NA NA 
# 2: 2014-01-01 NA NA NA NA NA NA NonOp NA NA NA 
# 3: 2014-01-01 NA NA NA NA NA Alert NA NA NA NA 
# 4: 2014-01-01 NA NA NA NA NA NA NA Alert NA NA 
# 5: 2014-01-02 NA NA NA NA NonOp NA NA NA NA NA 
# ---                
# 398: 2014-04-10 NA NA NA NA NA NA NonOp NA NA NA 
# 399: 2014-04-10 NA NA NA NA NonOp NA NA NA NA NA 
# 400: 2014-04-10 NonOp NA NA NA NA NA NA NA NA NA 
# 401: 2014-04-11 NA NA NA NonOp NA NA NA NA NA NA 
# 402: 2014-04-11 NA NA Alert NA NA NA NA NA NA NA 
+0

+1'cSplit' 코드는 깔끔하고 작습니다. – akrun

1

또한 dplyr

library(dplyr) 
library(tidyr) 
res <- df %>% 
separate(name, c("V1", "V2")) %>% 
mutate(V1=substr(V1, 1, 1), V2 =paste0("name_", V2)) %>% 
select(-unit) %>% 
spread(key=V2, value=V1) 

library(gtools) 
res1 <- res[,c(1,mixedorder(names(res)[-1])+1)] 
head(res1,2) 
    #   t name_1 name_2 name_3 name_4 name_5 name_6 name_7 name_8 name_9 
#1 2014-01-01 <NA> <NA>  N <NA> <NA> <NA> <NA> <NA> <NA> 
#2 2014-01-01 <NA> <NA> <NA> <NA> <NA>  N <NA> <NA> <NA> 
# name_10 
#1 <NA> 
#2 <NA> 
관련 문제