2017-04-07 3 views
1

이것은 매우 간단하며 솔루션이 있지만 열이 많아 시간이 많이 걸립니다. 다른 솔루션을 살펴 보았지만, 항상 약간 다른 (한 열을 집계하고 모든 열을 변경하는 등) 항상있었습니다. SQL에서 나는 select PAT_ID, max(X), max(Y), max(Z) from table_name group by PAT_ID을 할 것입니다.롤업 레코드, 각 열의 최대 수, group_by R

dt <- data.frame(
    PAT_ID = c('P','P','P','A','A','A'), 
    X = c(1,NA,NA, 1,NA,NA), 
    Y = c(NA,2,NA,NA,1,NA), 
    Z = c(NA,NA,1,NA,NA,0) 
) 

이 결과 그래서 요약 한 후 결합 :

내가 (하지만 더 열)과 같습니다 데이터 세트가

results_X <-dt %>%        
    group_by(PAT_ID) %>%       
    summarise(X = max(X, na.rm=TRUE)) 

results_Y <-dt %>%        
    group_by(PAT_ID) %>%      
    summarise(Y = max(Y, na.rm=TRUE)) 

results_Z <-dt %>%        
    group_by(PAT_ID) %>%      
    summarise(Z = max(Z, na.rm=TRUE)) 

resulted <- left_join(results_X, results_Y) 
resulted <- left_join(resulted, results_Z) 

내 출력이를 "롤 - PAT_ID 당 각 열의 최대 값 인 "최대"레코드 수 :

myresult <- data.frame(
    PAT_ID = c('P','A'), 
    X = c(1,1), 
    Y = c(2,1), 
    Z = c(1,0) 
    ) 

이렇게하는 것이 더 좋은 방법이라고 확신합니다. 하지만 어떻게?

답변

1

summarize_alldplyr으로 사용할 수 있습니다. 여기에 당신은 또한 기본 R은 aggregate을 사용하여 수행 할 수 있습니다

library(dplyr) 
dt %>% group_by(PAT_ID) %>% summarize_all(max, na.rm=T) 
# PAT_ID  X  Y  Z 
# <fctr> <dbl> <dbl> <dbl> 
# 1  A  1  1  0 
# 2  P  1  2  1 
+0

summarise_each (funs (max (., na.rm = TRUE))) ... 감사합니다! 나는 summarise_each가 변수에 의해 그룹에 적용되지 않는다는 것을 깨닫지 못했습니다. 구문에 대한 작은 편집을 알리는 것 – soporific

+0

@soporific'? summarise_each' 도움말 페이지의 메시지에 유의하십시오 : 미래에 mutate_each() 및 summarise_each()는 더 많은 기능을 가진 가족을 위해 더 이상 사용되지 않습니다 : mutate_all() , mutate_at(), mutate_if(), summarise_all(), summarise_at() 및 summarise_if() "를 참조하십시오. 그래서'summarize_all()'을 사용했습니다. – MrFlick

+0

오 고마워요! dplyr을 다시 설치하고 세션을 다시 시작하여 해당 fn을 가져와야했습니다. 새로운 기능! :) – soporific

1

이 이동합니다.

aggregate(dt[c("X","Y","Z")], dt["PAT_ID"], FUN=max, na.rm=TRUE) 
    PAT_ID X Y Z 
1  A 1 1 0 
2  P 1 2 1 
관련 문제