2017-12-19 16 views
1

두 가지 범주의 데이터간에 연속 변수를 기반으로 데이터 프레임을 정렬하려고합니다. 특히, 연속 변수를 정렬 (내림차순)하지만 비슷한 유형의 변수를 함께 보존하려고합니다. 예를 들면 다음과 같습니다.split-apply-combine : 여러 변수 정렬 및 그룹화 R

pets <- data.frame(animal = c("dog", "dog", "dog", "cat", "cat", "fish", "fish", "fish"), 
     breed = c("retriever", "husky", "husky", "grey", "white", "guppy", "betta", "betta"), 
     count = c(4, 3, 7, 8, 9, 2, 12, 1)) 

지금 데이터 프레임은 정렬되지 않습니다. 가장 높은 평균이 countbreeds이 먼저 나타나지만 모두 breed (및 animal 초)가 함께 그룹화되도록 정렬하려고합니다. breed을 기준으로 프레임을 주문하면 count의 올바른 순서를 잃게되고 그 반대의 경우도 마찬가지입니다. 두 가지를 모두 시도해도 :

pets[with(pets, order(breed, -count)), ] 

출력이 제대로 정렬되지 않습니다. split-apply-combine tutorials을 살펴 보았지만 내 데이터 에서처럼 두 그룹이 아닌 한 그룹의 데이터를 유지하려고 시도한 그룹 만 찾을 수있었습니다.

는 지금이 내가 가진 것 중에 최고입니다.

가 나는 그들이에가는 올바른 순서를 가지고,

cat.white  cat.grey  dog.husky dog.retriever fish.betta fish.guppy 
     9.0   8.0   5.0   4.0   6.5   2.0 

물론 반환

split_pets <- split(pets, pets$animal) 
    unlist(lapply(split_pets, function(x) sort(with(x, tapply(count, breed, mean)), decreasing = TRUE))) 

어느하지만 난 몰라 실제로 수단에 대해서조차, 나는 이것을 원본 데이터 프레임을 기준으로 정렬해야합니다. 다음으로 품종에 따라 토끼를 다시 채 웁니다.하지만 목록 목록의 데이터 프레임 열을 기준으로 정렬 할 것입니다. 너무 복잡해 보입니다. 나는 또한 order을 보내고 dplyr에서 group_by()으로 파이핑을 시도했지만 그게 지금보다 더 나을 수는 없다.

도움 주셔서 감사합니다.

답변

1

그룹을 먼저 정렬 한 다음 의도 한 순서대로 원래 세트로 다시 결합 할 수 있습니다.

pets <- data.frame(
    animal = c("dog", "dog", "dog", "cat", "cat", "fish", "fish", "fish"), 
    breed = c("retriever", "husky", "husky", "grey", "white", "guppy", "betta", "betta"), 
    count = c(4, 3, 7, 8, 9, 2, 12, 1), 
    stringsAsFactors = FALSE 
) 

library(dplyr) 

pets %>% 
    group_by(animal, breed) %>% 
    summarise(avg = mean(count)) %>% 
    right_join(pets, by = c("animal", "breed")) %>% 
    arrange(animal, desc(avg), desc(count)) %>% 
    select(-avg) %>% 
    ungroup 

# # A tibble: 8 x 3 
# animal  breed count 
# <chr>  <chr> <dbl> 
# 1 cat  white  9 
# 2 cat  grey  8 
# 3 dog  husky  7 
# 4 dog  husky  3 
# 5 dog retriever  4 
# 6 fish  betta 12 
# 7 fish  betta  1 
# 8 fish  guppy  2 
+0

이 솔루션은 내가 사용했던 솔루션 경로보다 훨씬 우아합니다. 그러나이 정확한 코드를 실행하면 오류가 발생합니다. '오류 :'에 의해 '조인 열'동물 ','품종 '이 LHS에서 누락 됨 줄 단위로 실행 중입니다. 나타납니다. right_join() (으)로 올라 오세요. – AcademicDialysis

+0

마지막 코멘트에서 제기 된 버그가 해결되었습니다. 문제는'plyr'가 내 네임 스페이스에서'dplyr' 전에로드되어'group_by'에서 나온 각 그룹에 대해 하나가 아닌'mean' 결과가 나온다는 것입니다. 여기에 비틀 거리다 : https://stackoverflow.com/questions/26923862/why-are-my-dplyr-group-by-summarize-not-working-properly-name-collision-with – AcademicDialysis