2014-04-29 3 views
1

행 단위로 집계하고 싶습니다. 나는 이것을하는 법을 알고 있으며 다른 사람들로부터 몇 가지 질문에 답해주었습니다. 그러나 집계 수식을 일반화하고 집계 된 행을 원본 데이터 집합에 처음 나타나는 것과 다른 순서로 배치하지 않는 것이 이상적입니다. 여기 행으로 일반화 된 집합체

는 예시적인 세트이다

my.data <- read.table(text = ' 
    0 0 0 1 
    0 0 0 1 
    2 2 2 2 
    2 2 2 2 
    0 4 0 0 
    0 4 0 0 
    2 2 0 0 
    2 2 0 0 
    2 2 0 0 
    2 2 0 0 
', header = FALSE) 

내 원하는 결과 : 행은 원래의 순서대로되어 있지이라도 여기

desired.result <- read.table(text = ' 
    0 0 0 1 2 
    2 2 2 2 2 
    0 4 0 0 2 
    2 2 0 0 4 
', header = FALSE) 

답을 얻을 수있는 한 가지 방법이있다 :

my.data[,(ncol(my.data)+1)] = 1 

aggregate(V5 ~ V1 + V2 + V3 + V4, FUN = sum, data=my.data) 

    V1 V2 V3 V4 V5 
1 2 2 0 0 4 
2 0 4 0 0 2 
3 0 0 0 1 2 
4 2 2 2 2 2 

다음은 집계 수식 일반화에 실패한 시도입니다.

with(my.data, aggregate(my.data[,ncol(my.data)], by = list(paste0('V', seq(1, ncol(my.data)-1))), FUN = sum)) 

결과의 순서는 일반화보다 덜 중요합니다.

감사합니다.

+0

"generalize"라고하면 집계 (V5 ~., my.data, sum)와 같은 의미입니까? –

+0

@alexis_laz 무슨 뜻인지 모르겠다. 코드가 실행되지 않습니다. 나는 원하는 결과를 제공했다. 내가 어떻게 설명 할 수 있는지 알려주십시오. 또한 V5는 일반화되지 않았습니다. 5 개의 기둥이있는 경우에만 적용됩니다. –

+1

죄송합니다. 예제 데이터 세트에서 "V5"를 부여한 것으로 간주했습니다. 빈도 카운트를 찾고 있다면'aggregate' 대신에'table'을 사용할 수 있습니까? 아니면 단순한 문제입니까? 예 : 'tmp = do.call (paste, my.data); data.frame (unique (my.data), unclass (table (factor, tmp, unique (tmp)))))' –

답변

2

원하는 결과는 고유 한 행의 빈도 수로 밝혀 졌기 때문에 (설명에서 언급 한대로) table을 사용할 수 있습니다. table은 인수에 factor을 사용하고 factor을 사용하면 "levels"을 지정하지 않으면 입력을 unique (unique는 정렬하지 않음)으로 지정하여 수준을 지정합니다. 따라서 레벨 (예 : 원하는 행 순서)을 "보려는"table의 경우 명시 적으로 지정된 factortable으로 전화해야합니다. 대신 당신의 행이 unique.data.frame 활용과 같은 호출 사용할 수 concatenated- 된 어디 as.data.frame.table를 호출

tmp = do.call(paste, my.data) 
as.data.frame(table(tmp)) 
#  tmp Freq 
#1 0 0 0 1 2 
#2 0 4 0 0 2 
#3 2 2 0 0 4 
#4 2 2 2 2 2  
res = table(factor(tmp, unique(tmp))) 
as.data.frame(res) 
#  Var1 Freq 
#1 0 0 0 1 2 
#2 2 2 2 2 2 
#3 0 4 0 0 2 
#4 2 2 0 0 4 

:

data.frame(unique(my.data), unclass(res)) 
# V1 V2 V3 V4 unclass.res. 
#1 0 0 0 1   2 
#3 2 2 2 2   2 
#5 0 4 0 0   2 
#7 2 2 0 0   4 
1

그것을 언급하는 것이 유용 할 수 있다는에서 count 기능 plyr 패키지는 또한 이것을 신속하게 집계 할 수 있습니다. 그래도 행의 원래 순서는 잃어 버릴 수 있습니다. 나는 기본 R을 선호하는 경향이 있기 때문에

> library(plyr) 
> x <- count(my.data) 
> x 
## V1 V2 V3 V4 freq 
## 1 0 0 0 1 2 
## 2 0 4 0 0 2 
## 3 2 2 0 0 4 
## 4 2 2 2 2 2 

내가 게시 된 답변 @alexis_laz에 의해 특히 대답을 좋아 desired.result 쇼로 테이블을 주문 (그리고 @alexis_laz에서 조각 대출),

> pst <- do.call(paste, my.data) 
> x[order(x$freq, as.factor(unique(pst))), ] 
## V1 V2 V3 V4 freq 
## 1 0 0 0 1 2 
## 4 2 2 2 2 2 
## 2 0 4 0 0 2 
## 3 2 2 0 0 4 
1

을하려면 . 그러나 일반적인 답변은 aggregate입니다. 출력의 행의 순서는 원래 데이터 세트에서 자신의 첫 등장 순서에서 차이가 있지만, 적어도 행이 집계됩니다

my.data <- read.table(text = ' 

    0 0 0 1 
    0 0 0 1 
    2 2 2 2 
    2 2 2 2 
    0 4 0 0 
    0 4 0 0 
    2 2 0 0 
    2 2 0 0 
    2 2 0 0 
    2 2 0 0 

', header = FALSE) 

my.data 

my.count = rep(1, nrow(my.data)) 
my.count 

aggregate(my.count ~ ., FUN = sum, data=my.data) 

    V1 V2 V3 V4 my.count 
1 2 2 0 0  4 
2 0 4 0 0  2 
3 0 0 0 1  2 
4 2 2 2 2  2 
:

내가 @ alexis_laz의 코멘트에서 aggregate.을 빌려