2017-10-23 2 views
2

공통 식별자와 특정 열을 기준으로 값을 행 비례 분할, 나는 보이는 데이터 프레임을 가지고 같은 :는 데이터 프레임 병합 처리 후

여행이 낚시 여행을 나타냅니다
df <- data.frame(trip=c(315,328,422,422,458,652,652,652,699), 
       catch_kg=c(10,8,12,2,26,4,18,14,11), 
       age_1=c(0,0,0,0,0,0,0,0,0), 
       age_2=c(2,1,7.5,7.5,8,11,11,11,13), 
       id=c(1,2,3,3,4,5,5,5,6)) 

trip catch_kg age_1 age_2 id 
315  10  0  2  1 
328  8  0  1  2 
422  12  0  7.5  3 
422  2  0  7.5  3 
458  26  0  8  4 
652  4  0  11  5 
652  18  0  11  5 
652  14  0  11  5 
699  11  0  13  6 

, catch_kg는 (kg)에서 잡은 물고기의 양, age_1 & age_2 각 여행 및 연령 집단 별 개인의 수이며, ID 각 여행에서 운반 ID를 나타냅니다.

낚시 여행 중에는 1 개 이상의 운행 거리가 있습니다. id 열에서 액세스 할 수 있습니다. 1 개 이상의 운행을하는 여행의 경우 동일한 ID 번호를 사용합니다. 예 : 여행 번호 422에는 두 hauls (id = 3)가 있습니다.

지금이 순간에, 1 개 이상의 운행을하는 여행의 경우, 각 연령 그룹의 개인 수를 해당 여행 내에서 보이는 밧줄 수로 똑같이 나눈 값이 있습니다. 예를 들어 여행 422에는 총 15 명의 개인이 있지만 2 개의 달랑이가 있기 때문에이 수를 2로 나눠서 1 인당 7.5 명의 개인을 산출합니다.

그러나 내가 원하는 것은 각 연령 그룹 내의 전체 캐치의 비율로 각 연령 그룹 내의 개인 수를 계산하는 것입니다. 이 여행 (422) (2 hauls도)에 대한 예를 들어, 내가있을 것 세 가지 계산의 규칙은 기본적으로

trip catch_kg age_1 age_2 id 
315  10  0  2 1 
328  8  0  1 2 
422  12  0  13 3 
422  2  0  2 3 
458  26  0  8 4 
652  4  0  4 5 
652  18  0  16 5 
652  14  0  13 5 
699  11  0  13 6 

: 같은 따라서, 마지막에 나는 보이는 데이터 프레임을 가지고 싶습니다 다음의 계산 :

haul1 : 12 * (7.5 + 7.5)/(12 + 2) = 13 개인 haul2 : 2 * (7.5 + 7.5)/(12 + 2) = 2 개인

있는가 이 계산을 계산하는 쉬운 방법? 도움을 주시면 감사하겠습니다.

-M

답변

0

또 다른 해결책은 data.table 사용 : 당신은 당신이 라운드 할 수 원하는 경우

library(data.table) 
setDT(df) 
df[, age_2 := catch_kg * sum(age_2)/sum(catch_kg), trip] 
# trip catch_kg age_1  age_2 id 
#1: 315  10  0 2.000000 1 
#2: 328  8  0 1.000000 2 
#3: 422  12  0 12.857143 3 
#4: 422  2  0 2.142857 3 
#5: 458  26  0 8.000000 4 
#6: 652  4  0 3.666667 5 
#7: 652  18  0 16.500000 5 
#8: 652  14  0 12.833333 5 
#9: 699  11  0 13.000000 6 

age_2round()과 : age_2 := round(catch_kg * sum(age_2)/sum(catch_kg))

1

당신은 가능성이 문제로 실행하는 것입니다 정확히 당신이 사람의 수를 정수로 얻기 위해 사용 된 규칙을 반올림하지만 확실하지 않음이

library(dplyr) 
df %>% group_by(trip) %>% 
    mutate(age_2=catch_kg/sum(catch_kg)*sum(age_2)) 
# trip catch_kg age_1  age_2 id 
# <dbl> <dbl> <dbl>  <dbl> <dbl> 
# 1 315  10  0 2.000000  1 
# 2 328  8  0 1.000000  2 
# 3 422  12  0 12.857143  3 
# 4 422  2  0 2.142857  3 
# 5 458  26  0 8.000000  4 
# 6 652  4  0 3.666667  5 
# 7 652  18  0 16.500000  5 
# 8 652  14  0 12.833333  5 
# 9 699  11  0 13.000000  6 

에 도움이 dplyr를 사용할 수 있습니다 더 복잡한 시나리오에서는 파트가 전체에 추가되지 않습니다.

관련 문제