2017-02-11 8 views
2

데이터 프레임 열을 3 개의 열로 쌓는 데 이상한 문제가 있습니다. 어떤 이유로 겹쳐 쌓일 때 factor 열의 값이 손실됩니다.R - Character Column은 열을 쌓을 때 값을 잃습니다.

이론적으로 아래의 코드를 사용하면 치료 값이 서로 겹쳐져 하나의 값으로 대체되지 않습니다.

library(reshape2) 
test1<-reshape(df, direction="long", varying=split(names(df), rep(seq_len(ncol(df)/4), 3))) 

나는 전체 결과를 붙여 없지만,이 주파수 테이블은 충분합니다 :

+4

유일하지 않은 colnames를 가진 데이터 프레임 (또는 목록과 같은 이름 붙은 객체)은 심각하게 잘못되었습니다 ('df [[ "Treatment"]]'는 무엇을 의미합니까?). 처음에는 건물을 지어야합니다. –

답변

2

중복 열 이름을 당신을 위해이 문제를 일으키는. 더 나은 방법은 열을 분리하고 열 이름을 수정 한 다음 rbind을 사용하여 함께 바인딩하는 것입니다. 나는의 정보를 저장하는 두 개의 새로운 열을 생성하여 모든 정보를 유지하기 위해 노력 q3_...

do.call('rbind', lapply(seq(3, 12, by = 3), function(x) { y <- df1[,(x-2):x ]; 
                  y <- do.call("cbind", list(mo = colnames(y)[1], yr = colnames(y)[2], y)); 
                  colnames(y)[3:4] <- c('mo_val', 'yr_val'); 
                  y })) 

#   mo  yr mo_val yr_val  Treatment 
# 1: q3_1mo q3_1yr  NA  NA anti-androgen 
# 2: q3_1mo q3_1yr  5 2012 anti-androgen 
# 3: q3_1mo q3_1yr  4 2008 anti-androgen 
# 4: q3_1mo q3_1yr  4 2010 anti-androgen 
# 5: q3_1mo q3_1yr  NA  NA anti-androgen 
# 6: q3_1mo q3_1yr  2 2008 anti-androgen 
# 7: q3_2mo q3_2yr  8 2010  docetaxel 
# 8: q3_2mo q3_2yr  5 2012  docetaxel 
# 9: q3_2mo q3_2yr  4 2008  docetaxel 
# 10: q3_2mo q3_2yr  4 2010  docetaxel 
# 11: q3_2mo q3_2yr  8 2011  docetaxel 
# 12: q3_2mo q3_2yr  2 2008  docetaxel 
# 13: q3_3mo q3_3yr  NA  NA abiraterone 
# 14: q3_3mo q3_3yr  5 2012 abiraterone 
# 15: q3_3mo q3_3yr  4 2008 abiraterone 
# 16: q3_3mo q3_3yr  4 2010 abiraterone 
# 17: q3_3mo q3_3yr  8 2011 abiraterone 
# 18: q3_3mo q3_3yr  2 2008 abiraterone 
# 19: q3_3mo q3_3yr  NA  NA   other 
# 20: q3_3mo q3_3yr  5 2012   other 
# 21: q3_3mo q3_3yr  4 2008   other 
# 22: q3_3mo q3_3yr  4 2010   other 
# 23: q3_3mo q3_3yr  8 2011   other 
# 24: q3_3mo q3_3yr  2 2008   other 
#   mo  yr mo_val yr_val  Treatment 

데이터 :

df1 <- structure(list(q3_1mo = c(NA, 5L, 4L, 4L, NA, 2L), 
         q3_1yr = c(NA, 2012L, 2008L, 2010L, NA, 2008L), 
         Treatment = c("anti-androgen", "anti-androgen", "anti-androgen", "anti-androgen", "anti-androgen", "anti-androgen"), 
         q3_2mo = c(8L, 5L, 4L, 4L, 8L, 2L), 
         q3_2yr = c(2010L, 2012L, 2008L, 2010L, 2011L, 2008L), 
         Treatment = c("docetaxel", "docetaxel", "docetaxel", "docetaxel", "docetaxel", "docetaxel"), 
         q3_3mo = c(NA, 5L, 4L, 4L, 8L, 2L), 
         q3_3yr = c(NA, 2012L, 2008L, 2010L, 2011L, 2008L), 
         Treatment = c("abiraterone", "abiraterone", "abiraterone", "abiraterone", "abiraterone", "abiraterone"), 
         q3_3mo = c(NA, 5L, 4L, 4L, 8L, 2L), 
         q3_3yr = c(NA, 2012L, 2008L, 2010L, 2011L, 2008L), 
         Treatment = c("other", "other", "other", "other", "other", "other")), 
       .Names = c("q3_1mo", "q3_1yr", "Treatment", "q3_2mo", "q3_2yr", "Treatment", "q3_3mo", "q3_3yr", "Treatment", "q3_3mo", "q3_3yr", "Treatment"), 
       row.names = c(NA, -6L), class = "data.frame") 
1

또한이 문제를 해결하고 고유 한 이름을 부여하여 동일한 코드를 사용할 수 있습니다 make.unique으로 변수에 추가하십시오.

names(df) <- make.unique(names(df)) 
test1 <- reshape(df, direction="long", 
       varying=split(names(df), rep(seq_len(ncol(df)/4), 3))) 

TEST1

time q3_1mo q3_1yr  Treatment id 
1.1 1  NA  NA anti-androgen 1 
2.1 1  5 2012 anti-androgen 2 
3.1 1  4 2008 anti-androgen 3 
4.1 1  4 2010 anti-androgen 4 
5.1 1  NA  NA anti-androgen 5 
6.1 1  2 2008 anti-androgen 6 
1.2 2  8 2010  docetaxel 1 
2.2 2  5 2012  docetaxel 2 
3.2 2  4 2008  docetaxel 3 
4.2 2  4 2010  docetaxel 4 
5.2 2  8 2011  docetaxel 5 
6.2 2  2 2008  docetaxel 6 
1.3 3  NA  NA abiraterone 1 
2.3 3  5 2012 abiraterone 2 
3.3 3  4 2008 abiraterone 3 
4.3 3  4 2010 abiraterone 4 
5.3 3  8 2011 abiraterone 5 
6.3 3  2 2008 abiraterone 6 
1.4 4  NA  NA   other 1 
2.4 4  5 2012   other 2 
3.4 4  4 2008   other 3 
4.4 4  4 2010   other 4 
5.4 4  8 2011   other 5 
6.4 4  2 2008   other 6 

당신은 약간의 열을 이름을 청소하고 어쩌면 제거 라인의 몇 가지를 지출해야 할 것입니다 반환하지만 코드를 통해 갈 것입니다. 또한 reshape은 기본 R 함수이므로로드 reshape2은 필요하지 않습니다.