2013-10-07 3 views
2

지금까지 2 일 동안 솔루션을 검색했습니다.R : 데이터를 집계하지만 집계되지 않은 열의 정보를 유지하는 방법은 무엇입니까?

다른 관측 지점의 조류 관찰이 있습니다. 관찰자들은 그 종을 본 곳에서, 그리고 그 종을 얼마 동안 기록합니다.

이제 다른 지점에서 관측치가 같은 영역에서 취해 지지만 한 지역의 한 종당 최대 값만 처리하려고합니다.

처음에는 관찰 지점, 종 및 면적으로 데이터를 집계 한 다음 시간을 요약했습니다.

dt.agg <- aggregate(time ~ observp + species + time, dt, sum) 

UUPS : completly 잘못된 명령을

하는 했어야은 :

dt.agg <- aggregate(time ~ observp + species + area, dt, sum) 



    observp species area time 
1  1a Rm A1  43.878488 
2  1c Rm A1  296.152707 
3  2 Rm A1  29.546790 
4  1a Swm A1  34.127713 
5  1b Swm A1  11.076880 
6  2 Swm A1   8.771703 

이 확인했다. 하지만 지금은 한 지역에있는 종의 최대 시간 값을 필요로합니다. 그러나이 숫자가 어떤 관측 지점에서 취해 졌는지도 알아야합니다.

예에서 행 1과 3은 삭제해야하지만, 행 2는 A1의 Rm에 보관해야합니다. 행 4 (유지) 및 5 + 6 (하락)에도 동일하게 적용됩니다.

시간과 최대에 따라 종과 영역이있는 다른 집계를 수행하면 관측점에 대한 정보가 손실됩니다.

누군가가 이것을 달성 할 수있는 방법을 보여줄 수 있습니까?

건배

베른트

(지금 새로운 계정없이 명성 .. 감사합니다 ... 구글!)

추신을 이 질문에 더 좋은 헤드 라인을 주시겠습니까?

업데이트 : dput (head (dt, 100)) - 샘플을 제안대로 게시하려고합니다. 원본 데이터 세트에는 1300 개가 넘는 행이 있습니다. 희망은 당신이 갖고 싶은 것입니다.

structure(list(species = structure(c(3L, 3L, 3L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 
5L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 
5L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 3L, 3L, 3L, 5L, 5L, 5L, 
3L, 3L, 3L, 3L, 3L, 3L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L), .Label = c("Bf", 
"Gr", "Rm", "Row", "Swm", "Wf", "Wsb", "Wst", "Ww"), class = "factor"), 
    area = structure(c(35L, 19L, 34L, 34L, 32L, 19L, 34L, 35L, 
    10L, 36L, 10L, 14L, 13L, 25L, 27L, 28L, 34L, 19L, 14L, 14L, 
    34L, 1L, 12L, 13L, 15L, 3L, 3L, 34L, 34L, 34L, 14L, 14L, 
    13L, 13L, 1L, 1L, 1L, 11L, 1L, 8L, 21L, 22L, 22L, 9L, 9L, 
    9L, 5L, 9L, 3L, 22L, 27L, 26L, 21L, 26L, 21L, 27L, 3L, 9L, 
    20L, 20L, 9L, 26L, 34L, 30L, 3L, 2L, 3L, 4L, 20L, 3L, 37L, 
    16L, 17L, 18L, 14L, 35L, 34L, 34L, 34L, 36L, 4L, 4L, 3L, 
    3L, 17L, 17L, 38L, 36L, 10L, 38L, 36L, 10L, 38L, 37L, 35L, 
    30L, 16L, 15L, 17L, 5L), .Label = c("A1", "A10", "A11", "A12", 
    "A13", "A14", "A15", "A16", "A17", "A18", "A2", "A3", "A4", 
    "A5", "A6", "A7", "A8", "A9", "O1", "O10", "O11", "O12", 
    "O13", "O14", "O15", "O16", "O17", "O18", "O19", "O2", "O20", 
    "O21", "O22", "O3", "O4", "O5", "O7", "O8", "O9"), class = "factor"), 
    observp = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("1a", "1b", "1c", "2", "3", "4"), class = "factor"), 
    time = c(36.37086972, 2.730715967, 1.891286914, 3.782573827, 
    4.496276059, 5.461431934, 18.91286914, 13.22577081, 5.823001976, 
    5.392743201, 3.882001317, 16.97305991, 6.094384821, 5.274262222, 
    5.462035947, 2.089427691, 7.565147654, 21.84572774, 25.45958986, 
    16.97305991, 7.565147654, 4.875387532, 8.885792099, 4.062923214, 
    6.636122805, 7.038317277, 10.55747592, 7.565147654, 7.565147654, 
    3.782573827, 25.45958986, 25.45958986, 12.18876964, 12.18876964, 
    19.50155013, 19.50155013, 9.750775065, 39.20627398, 4.875387532, 
    6.423076843, 2.436283538, 1.823249104, 1.823249104, 16.72889022, 
    41.82222555, 33.45778044, 12.30932064, 117.1022315, 3.519158639, 
    1.823249104, 27.31017974, 11.11346598, 4.872567077, 11.11346598, 
    4.872567077, 5.462035947, 3.519158639, 16.72889022, 14.86012871, 
    8.916077225, 25.09333533, 22.22693195, 3.782573827, 5.184879322, 
    10.55747592, 8.509038411, 10.55747592, 17.70988435, 5.944051483, 
    3.519158639, 17.69229328, 34.70586347, 5.966017168, 3.092236431, 
    2.828843318, 6.612885403, 3.782573827, 3.782573827, 7.565147654, 
    5.392743201, 17.70988435, 17.70988435, 3.519158639, 2.346105759, 
    11.93203434, 11.93203434, 2.386548395, 0.898790534, 0.64700022, 
    2.386548395, 0.898790534, 0.64700022, 2.684866944, 6.634609979, 
    1.239916013, 1.944329746, 3.2536747, 3.732819078, 6.711769315, 
    2.307997621)), .Names = c("species", "area", "observp", "time" 
), row.names = c(NA, 100L), class = "data.frame") 
+0

안녕하세요, 'dput (head (dt, 100))'과 같이'dput (dt)'의 결과 또는 너무 큽니다. 또한, 당신이 시도한 두 번째'집계 '는 무엇입니까? – Frank

+0

Bernd,'dput (yourobject)'또는'dput (head (yourobject))'를 사용하여 데이터 샘플을 가짜 데이터에 추가하십시오. [이 게시물] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)은이를 수행하는 방법에 대한 표준 리소스입니다. – SlowLearner

+0

나는 잠시 동안 (계정 혼란) 나는 아니었다. 표시된 솔루션이 저에게 효과적이었습니다. 다른 사람들을 확인할 시간이 없었어요. 고맙습니다. 친절한 도움을! –

답변

2

는 또한 by,보고 또 다른 base 기능을 가질 수있다. 출력은 각 요소가 INDICES의 다른 조합에 대한 결과 인 목록입니다.

bb <- by(data = df, INDICES = list(df$species, df$area), function(x) x[which.max(x$time), ]) 
bb 
# : Rm 
# : A1 
# observp species area  time 
# 2  1c  Rm A1 296.1527 
# -------------------------------------------------------------------- 
# : Swm 
# : A1 
# observp species area  time 
# 4  1a  Swm A1 34.12771 

당신은 data.frame에 목록을 변환 할 경우

df2 <- do.call(rbind, bb) 
df2 
# observp species area  time 
# 2  1c  Rm A1 296.15271 
# 4  1a  Swm A1 34.12771 

또 다른 대안 :

library(plyr) 
ddply(.data = df, .variables = .(species, area), subset, 
    time == max(time)) 
+0

이것은 첫 번째 집계 결과에 대한 트릭을 수행하는 것 같습니다. 나는 종과 지역의 단순한 두 번째 집성과 같은 285 행을 얻지 만 이번에는 적절한 관측점을 가지고 데이터를 유지했다. 내일, 지금 toooo 늦게 확인할 것입니다 ... 지금까지 모두에게 많은 고맙습니다! –

0

예는

stulevel_agg_2 <- stulevel[, list(a1=mean(ability, na.rm = TRUE), a2=last(school, na.rm=T)),by = grade]

a1, a2은 새로운 열 이름입니다. last은 그룹 내에서 마지막 요소를 가져올 수 있지만 먼저 xts을로드해야합니다.

관련 문제