2014-12-22 2 views
1

로컬 인프라 프로젝트에 대한 조사 결과의 히트 맵을 만들려고합니다. 이 설문 조사는 사람들에게 프로젝트의 주요 비용과 주요 이익이 무엇인지 예측할 것을 요청했습니다. 나는 이미 ggplot을 사용하여 비용 및 이점에 대한 간단한 히트 맵을 작성했습니다. 이제 "비용"열의 각 항목에 대한 카테고리 합계를 기준으로 정규화하는 데이터 세트에 새로운 "빈도"열을 만들려고합니다 (아래 참조). 그래서 "Frequency2"의 처음 네 가지 항목을 "빈도"열의 해당 항목으로 나누어 주택 가격이 주요 비용 (61)이고 100을 곱하여 퍼센트. R에서 이것을 할 수있는 빠른 방법이 있습니까? Excel에서 sumif를 사용하여 카테고리 합계를 구한 다음 if 문을 사용하여 새 열을 만들면됩니다. R에 비슷한 프로세스가 있습니까? 감사!새로운 데이터 프레임 열이 기존 열의 조건부

 Benefits Costs   Frequency 
14 Local Comp Housing Prices 8 
16   Jobs Housing Prices 26 
17   Other Housing Prices 0 
18   None Housing Prices 27 
20 Local Comp   Traffic 7 
22   Jobs   Traffic 17 
23   Other   Traffic 1 
24   None   Traffic 11 

데이터

df <- data.frame(Benefits=c("Local Comp", "Jobs", "Other", "None", "Local Comp", "Jobs", "Other", "None"), 
Costs=c("Housing Prices", "Housing Prices", "Housing Prices", "Housing Prices", "Traffic", "Traffic", "Traffic", "Traffic"), 
Frequency=c(8,26,0,27,7,17,1,11)) 

답변

3

당신은 그룹 당 주파수의 합을 계산하는 ave를 사용할 수 있습니다.

library(dplyr) 
df %>% group_by(Costs) %>% mutate(Frequency2 = Frequency/sum(Frequency) * 100) 
#Source: local data frame [8 x 4] 
#Groups: Costs 
# 
# Benefits   Costs Frequency Frequency2 
#1 Local_Comp Housing_Prices   8 13.114754 
#2  Jobs Housing_Prices  26 42.622951 
#3  Other Housing_Prices   0 0.000000 
#4  None Housing_Prices  27 44.262295 
#5 Local_Comp  Traffic   7 19.444444 
#6  Jobs  Traffic  17 47.222222 
#7  Other  Traffic   1 2.777778 
#8  None  Traffic  11 30.555556 

또는 data.table 사용 :

library(data.table) 
setDT(df)[, Frequency2 := Frequency/sum(Frequency) * 100, by = Costs ] 
매우 큰 데이터 세트가있는 경우, 당신은 더 높은 성능을 dplyr 사용할 수

transform(df, Frequency2 = Frequency/ave(Frequency, Costs, FUN = sum) * 100) 
#  Benefits   Costs Frequency Frequency2 
#14 Local_Comp Housing_Prices   8 13.114754 
#16  Jobs Housing_Prices  26 42.622951 
#17  Other Housing_Prices   0 0.000000 
#18  None Housing_Prices  27 44.262295 
#20 Local_Comp  Traffic   7 19.444444 
#22  Jobs  Traffic  17 47.222222 
#23  Other  Traffic   1 2.777778 
#24  None  Traffic  11 30.555556 

또는 : 나는 transform 안에이 작업을 수행

+0

'data.table' 부분이 부적절합니다. 'by ='btw를 제거하여 키 스트로크를 줄일 수 있습니다 –

+1

하하! D @DavidArenburg –

+2

@docendodiscimus보다 더 많은 시간이 걸렸지 만'df %> % group_by (비용) %> % mutate (Frequency2)를 생각해 냈습니다. = Frequency/sum (Frequency) * 100)'또한 –

관련 문제