2012-12-29 3 views
-1

결과를 어떻게 집계 할 수 있습니까?집계에서 동일한 결과를 얻는 방법?

x=iris[,1:4] 
transform(x,"sum"=apply(x,MARGIN=1,FUN=sum)) 

출력은 다음과 같습니다 집계 함수가 적용되는

Sepal.Length Sepal.Width Petal.Length Petal.Width sum 
1   5.1   3.5   1.4   0.2 10.2 
2   4.9   3.0   1.4   0.2 9.5 
3   4.7   3.2   1.3   0.2 9.4 
4   4.6   3.1   1.5   0.2 9.4 

(많은 라인이 생략), 난 그냥 집계 더 잘 알고 싶은, 어쩌면이 같은 결과를 얻기 어렵다.

+0

당신이 바로, 그 반대를 의미한다 :과 같이 설정 아이리스 데이터의 각 행에 대해 별도의 그룹은 따라서 사고로 '트릭'aggregate해야 할 것입니까? – Rubens

+2

이것은 전혀 이해가되지 않습니다. 적용하고 집계하는 것은 완전히 다른 일을합니다. – joran

+1

@joran에 동의합니다. 당신은 당신이 일반적으로 성취하고자하는 것을 분명히하기 위해 질문을 재 형성해야합니다. 지금 당장은 둥근 구멍에 사각 못을 끼워 넣는 법을 묻는 것처럼 들립니다. 단지'apply'에 대한 호출을 피하고자한다면, 대안은'sum = rowSums (x)'입니다. –

답변

0

루벤스는 정확하고 당신이 사용하고자하는 경우 aggregate 대신 apply인데, 오늘의 이전 게시물에서와 마찬가지로 aggregate 표현에 관심이 있으시면 tapply을 사용할 수 있습니다.

What is the meaning of ~ in aggregate?

x=iris[,1:4] 
names(x)<-c("x1","x2","x3","x4") 
aggregate(x1+x2+x3+x4~x1,FUN=sum,data=x) 
tapply((x$x1 + x$x2 + x$x3 + x$x4), x$x1, sum) 

편집 sapplylapply가 동일한 바로 위의 tapplyaggregate 같은 대답뿐만 아니라 rapply, vapply과 포맷 tapplyby 기능을 제공하기 위해 DWIN의 대답에서 수정 추가 :

with(x, sapply(split((x1 + x2 + x3 + x4), x1), sum)) 
with(x, lapply(split((x1 + x2 + x3 + x4), x1), sum)) 
with(x, rapply(split((x1 + x2 + x3 + x4), x1), sum)) 
with(x, tapply(  (x1 + x2 + x3 + x4), x1 , sum)) 
with(x, vapply(split((x1 + x2 + x3 + x4), x1), sum, FUN.VALUE=1)) 
with(x, by((x1 + x2 + x3 + x4), x1, sum)) 

mapply으로 같은 대답을 얻는 방법을 알아 냈습니다. 음, 여기에 한 가지 방법이지만, 꽤 바보 :

tapply(apply((x[,1:4]),1,sum),x$x1,sum) 
:

tapply(mapply(sum, x$x1 , x$x2 , x$x3 , x$x4), x$x1, sum) 

마지막으로, 여기에 위의 다른 라인에 의해 주어진 같은 답을 얻기 위해서 (tapply 내부) apply를 사용하는 방법입니다

마지막으로 한 가지는, aggregate이 게시글에 apply 문과 동일한 대답을 반환하도록 할 수 있습니다. 그러나 각 행을 apply 문으로 요약하면됩니다.

x=iris[,1:4] 
names(x)<-c("x1","x2","x3","x4") 
apply.sums <- transform(x,"sum"=apply(x,MARGIN=1,FUN=sum)) 
my.factor <- seq(1, nrow(x)) 
ag.sums <- aggregate(x1+x2+x3+x4~my.factor,FUN=sum,data=x) 
round(ag.sums[,2],2) == round(apply.sums[,5],2) 
2

귀하의 질문은 내가 따라야 할 코드와 다소 다를 것 같습니다. aggregate은 "by"인수로 구분 된 범주 내에서만 특정 함수를 열에 적용하기위한 것입니다. 특정 범주 내에서 집계하도록 설계되었습니다.

apply (두 번째 인수는 코드에서와 같이 1이 아니라 2로 설정 됨) 전체 열에 대해 함수를 사용합니다. 그룹화 변수가 없습니다. 코더가 실행 중입니다. 각기 다른 의미와 수입의 벡터에 대해 한 줄씩 행을 옮겨서 각 개인에 대한 4 가지 다른 측정치의 개별적인 합계를 반환합니다.이 과정은 절차를위한 준비 또는 토대가 마련되지 않으면 틀림없이 무의미한 과정입니다.

If 당신은 유사한 방식으로 적용을 원한다. 다음을 보라.

> sapply(split(iris[,1:4], iris[, 5]), apply, 2, sum) 
      setosa versicolor virginica 
Sepal.Length 250.3  296.8  329.4 
Sepal.Width 171.4  138.5  148.7 
Petal.Length 73.1  213.0  277.6 
Petal.Width 12.3  66.3  101.3 


> aggregate(iris[ ,1: 4], iris[5], FUN=sum) 
    Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  setosa  250.3  171.4   73.1  12.3 
2 versicolor  296.8  138.5  213.0  66.3 
3 virginica  329.4  148.7  277.6  101.3 

당신의 목표는 당신이 dataframe의 행의 수와 동일한 길이의 총 목록을 통과하는 어떤 별 분류 계산을 할되지 않은 경우 :

> aggregate(iris[ ,1: 4], list(rep(1,nrow(iris))), FUN=sum) 
    Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  1  876.5  458.6  563.7  179.9 
> apply(iris[1:4], 2, sum) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
     876.5  458.6  563.7  179.9 
+0

은 집계와 비슷한 방식으로 적용됩니다. 예를 들어 우선적 인 이유에 대한 신청을 선호 할 수 있다고 생각합니까? – agstudy

+1

'apply.data.frame'은 일반적으로 큰 성능을 나타내지 않습니다. 더 나은 성능을 내기 위해'sapply' 또는'lapply'를 사용하는 접근 방식을 기대합니다. 그들은 더 적은 클래스 검사를합니다. 'colMeans' 또는'colSums'는 질문이 그 기능에 적합하다면 가장 빠를 것입니다. –

관련 문제