2014-08-31 5 views
0

데이터 프레임 내에서 선택된 열을 합산하는 데 문제가 있습니다. StackOverflow에서 비슷한, 그러나 동일한 질문/대답은 많이 보지 못했습니다. - 각 사이트 내 의한데이터 프레임의 열 범위 합계

site<-c(223,257,223,223,257,298,223,298,298,211) 
moisture<-c(7,7,7,7,7,8,7,8,8,5) 
shade<-c(83,18,83,83,18,76,83,76,76,51) 
sampleID<-c(158,163,222,107,106,166,188,186,262,114) 
bluestm<-c(3,4,6,3,0,0,1,1,1,0) 
foxtail<-c(0,2,0,4,0,1,1,0,3,0) 
crabgr<-c(0,0,2,0,33,0,2,1,2,0) 
johnson<-c(0,0,0,7,0,8,1,0,1,0) 
sedge1<-c(2,0,3,0,0,9,1,0,4,0) 
sedge2<-c(0,0,1,0,1,0,0,1,1,1) 
redoak<-c(9,1,0,5,0,4,0,0,5,0) 
blkoak<-c(0,22,0,23,0,23,22,17,0,0) 

my.data<-data.frame(site,moisture,shade,sampleID,bluestm,foxtail,crabgr,johnson,sedge1,sedge2,redoak,blkoak) 

나는 각 식물 종 (이 예에서는 열 4-12 bluestem, 강아지풀 등)의 수를 합계를이 아마도 지나치게 복잡한 데이터 프레임

같은 사이트 번호를 가진 행을 합산합니다. 나는 또한 습기와 그늘에 관한 정보를 유지하기를 원한다. (이것들은 사이트와 일치하지만 사이트간에 동일 할 수도있다.) 그리고 합산 된 행의 수를 나타내는 새로운 열을 원한다.

결과가이

사이트, 습기, 그늘, NumSamples, bluestm, 강아지풀, 같을 것이다 crabgr, 존슨, sedge1는 sedge2는 REDOAK는 blkoak
211,5,51,1,0,0 , 0,0,0,1,0,0
223,7,83,4,13,5,4,8,6,1,14,45
257,7,18,2,4,2 , 33,0,0,1,1,22는
298,8,76,3,2,4,3,9,13,2,9,40

오전 데 문제가 있다는 것입니다 내 실제 데이터 세트 (그리고 나는 그들 중 몇 개가있다)는 50 ~ 300 종의 식물을 가지고 있으며, 이 경우, [5시 12 분]) my.data $ foxtail, my.data $ sedge1, 등, 이것은 300 종으로 매우 어려울 것입니다.

나는 내가 필요하지 않은 열 (SampleID)

my.data$SampleID <- NULL 

하지만 그때는 어떻게 합계를받을 수 있나요을 삭제하여 시작할 수있어? 나는 집계 명령과 ddply를 망쳤으며 특정 열 이름을 호출하는 많은 예제를 보았지만 아무 것도 작동시키지 못했습니다. 이 질문은 일반적으로 묻고 간단한 질문 유형의 변형입니다.하지만 혼자서 해결하지 않고 몇 시간을 보냈습니다. 그래서, 내 어리 석음에 사과!

+0

: 귀하의 의견은 이해할 수있을 것이다. – rnso

답변

1

이 작품을 좋아 :

x <- aggregate(my.data[,5:12], by=list(site=my.data$site, moisture=my.data$moisture, shade=my.data$shade), FUN=sum, na.rm=T) 



library(dplyr) 

my.data %>% 
    group_by(site) %>% 
    tally %>% 
    left_join(x) 

    site n moisture shade bluestm foxtail crabgr johnson sedge1 sedge2 redoak blkoak 
1 211 1  5 51  0  0  0  0  0  1  0  0 
2 223 4  7 83  13  5  4  8  6  1  14  45 
3 257 2  7 18  4  2  33  0  0  1  1  22 
4 298 3  8 76  2  4  3  9  13  2  9  40 

아니면 모든 작업을 수행하는 기본 R을 사용하여 다음과 같은 시도

my.data %>% 
    group_by(site) %>% 
    tally %>% 
    left_join(my.data) %>% 
    group_by(site,moisture,shade,n) %>% 
    summarise_each(funs(sum=sum)) %>% 
    select(-sampleID) 


    site moisture shade n bluestm foxtail crabgr johnson sedge1 sedge2 redoak blkoak 
    1 211  5 51 1  0  0  0  0  0  1  0  0 
    2 223  7 83 4  13  5  4  8  6  1  14  45 
    3 257  7 18 2  4  2  33  0  0  1  1  22 
    4 298  8 76 3  2  4  3  9  13  2  9  40 
+0

당신의 위의 예가 그것을하는 것처럼 보입니다. 그리고 나는 그것을 이해할 수있을 것이라고 생각합니다. 더 낮은 (모두 dplyr에서) 올바르게 계산되지 않습니다. 작업 솔루션을 보내 주셔서 감사합니다! –

+0

@SteveT - 좋은 캐치, 고정. – jalapic

+0

고마워요. 실제로이 기능을 구현하면 다음과 같은 오류 메시지가 나타납니다. 경고 : install.packages : 'dplyr'패키지를 사용할 수 없습니다 (R 버전 2.15.2) –

1

dplyr에 : SteveT @

outdf<-data.frame(site=numeric(),moisture=numeric(),shade=numeric(),bluestm=numeric(),foxtail=numeric(),crabgr=numeric(),johnson=numeric(),sedge1=numeric(),sedge2=numeric(),redoak=numeric(),blkoak=numeric()) 

my.data$basic = with(my.data, paste(site, moisture, shade)) 

for(b in unique(my.data$basic)) { 
     outdf[nrow(outdf)+1,1:3] = unlist(strsplit(b,' ')) 
     for(i in 4:11) 
      outdf[nrow(outdf),i]= sum(my.data[my.data$basic==b,i]) 
} 

outdf 
    site moisture shade bluestm foxtail crabgr johnson sedge1 sedge2 redoak blkoak 
1 223  7 83  13  5  4  8  6  1  14  45 
2 257  7 18  4  2  33  0  0  1  1  22 
3 298  8 76  2  4  3  9  13  2  9  40 
4 211  5 51  0  0  0  0  0  1  0  0 
+0

감사합니다. 작동하는 것처럼 보입니다. –

관련 문제