2013-04-16 2 views
2

나는열 이름을 기준으로 테이블 크기를 줄이는 방법

Class1 0.438 0.441 0.442 0.444 0.545 0.546 0.548 0.609 0.651 0.652 0.655 
    DAWO  2  2  0  1  0  0  0  1  1  5  1 
    DRWO  1  1  3  1  1  1  1  0  0  1  0 
    DHWO  1  2  0  0  0  0  0  0  0  0  0 

의 라인을 따라 형식 내가 & 이름 열을 기반으로 열을 병합하여 테이블의 크기를 줄이고 싶습니다이있는 테이블이 값을 더합니다. 예 :

Class1 0.4 0.5 0.6 
    DAWO  5  0  8  
    DRWO  6  3  1  
    DHWO  3  0  0  

어떻게 가능합니까? 당신의 도움에 미리 감사합니다, 원래의 세트에서 행 이름있는 DAW0 등 그래서 나는, 텍스트 Class1을 복사 한 적이 없다

답변

1
x <- read.table(header=TRUE, text="  0.438 0.441 0.442 0.444 0.545 0.546 0.548 0.609 0.651 0.652 0.655 
DAWO  2  2  0  1  0  0  0  1  1  5  1 
DRWO  1  1  3  1  1  1  1  0  0  1  0 
DHWO  1  2  0  0  0  0  0  0  0  0  0 ", check.names=F) 

참고.

첫째, aggregate에 도움이되는 전치을 :

tx <- as.data.frame(t(x)) 

이가 상처가 있습니다. 값이 0과 1 사이에 있다고 가정합니다. 필요에 따라 조정합니다.

tx$bin <- cut(as.numeric(rownames(tx)), breaks=seq(0,1,.1)) 

는 값을 추가 이름을 설정하고 다시 트랜스 :

xx <- aggregate(.~bin, data=tx, FUN=sum) 
rownames(xx) <- xx$bin 
t(xx[-1]) 
##  (0.4,0.5] (0.5,0.6] (0.6,0.7] 
## DAWO   5   0   8 
## DRWO   6   3   1 
## DHWO   3   0   0 
1

가 여기에 또 다른 대안이다. @ Matthew의 대답에서 "x"를 사용하면 strtim을 사용하여 이름에서 카테고리를 만들고 집계 할 카테고리에 sapply을 사용할 수 있습니다. 고전이, 마지막으로

mymatch <- strtrim(names(mydf), 3)[-1] 
cbind(mydf[1], 
     sapply(unique(mymatch), 
      function(y) rowSums(mydf[-1][, mymatch == y, drop = FALSE]))) 
# Class1 0.4 0.5 0.6 
# 1 DAWO 5 0 8 
# 2 DRWO 6 3 1 
# 3 DHWO 3 0 0 

:

mymatch <- strtrim(names(x), 3) 
sapply(unique(mymatch), function(y) rowSums(x[, mymatch == y, drop = FALSE])) 
#  0.4 0.5 0.6 
# DAWO 5 0 8 
# DRWO 6 3 1 
# DHWO 3 0 0 

또는 원래의 데이터를 사용하여, 당신은 단지 rowSums을 복용 할 때 "클래스 1"열을 드롭 기억에 대해 조금주의해야 melt*cast 포함 "reshape2"접근 : 마지막 두 가지 예를 들어

> library(reshape2) 
> Stacked <- melt(mydf) 
Using Class1 as id variables 
> dcast(Stacked, Class1 ~ strtrim(variable, 3), fun.aggregate=sum) 
    Class1 0.4 0.5 0.6 
1 DAWO 5 0 8 
2 DHWO 3 0 0 
3 DRWO 6 3 1 

mydf은 다음과 같이 정의됩니다.

mydf <- structure(list(Class1 = structure(c(1L, 3L, 2L), .Label = c("DAWO", 
"DHWO", "DRWO"), class = "factor"), `0.438` = c(2L, 1L, 1L), 
    `0.441` = c(2L, 1L, 2L), `0.442` = c(0L, 3L, 0L), `0.444` = c(1L, 
    1L, 0L), `0.545` = c(0L, 1L, 0L), `0.546` = c(0L, 1L, 0L), 
    `0.548` = c(0L, 1L, 0L), `0.609` = c(1L, 0L, 0L), `0.651` = c(1L, 
    0L, 0L), `0.652` = c(5L, 1L, 0L), `0.655` = c(1L, 0L, 0L)), 
.Names = c("Class1", "0.438", "0.441", "0.442", "0.444", "0.545", "0.546", 
"0.548", "0.609", "0.651", "0.652", "0.655"), class = "data.frame", 
row.names = c(NA, -3L)) 
관련 문제