2016-09-28 2 views
0

내 dataframe은 다음과 같습니다 : 만 매년 내에서 도시로 도시 부의 상대에 따라 dataframe을 부분 집합하는 간단한 방법을 찾고 있어요하위 집합을 기반으로 그룹 내 분위수

df 
city year wealth 
a  2001 1 
a  2002 30 
b  2001 2 
b  2002 20 
c  2001 3 
c  2002 10 

. 그래서 나는이 같은 출력거야 :

top_third 
city year wealth 
a  2002 30 
c  2001 3 

mid_third 
city year wealth 
b  2001 2 
b  2002 20 

low_third 
city year wealth 
c  2002 10 
a  2001 1 

접근 방식을 나는이 같은 모습을 노력했습니다 :

top_third <- subset(df, wealth > quantile(wealth, 0.66, na.rm = TRUE)) 
non_rich <- subset(df, wealth <=quantile(wealth, 0.66, na.rm = TRUE)) 
mid_third <- subset(non_rich, wealth > quantile(wealth, 0.5, na.rm = TRUE)) 
low_third <- subset(non_rich, wealth <=quantile(wealth, 0.5, na.rm = TRUE)) 

나는이 방법으로 데 가장 큰 문제는 내가 할 수있는 것입니다 매년 범위 내에서 십자형 을 계산하는 방법을 찾지 못합니다. 누구든지이 작업을 수행 할 수있는 간단한 방법을 알고 있습니까?

+0

당신이 무엇을 얻을이 도움을합니까 너는 원하는가? data.table 패키지 ('library (data.table)')를 사용하여'df'를 data.table ('setDT (df)')로 취급하십시오. 당신은'df [, rank : = rank (wealth)/length (wealth), by = "year"]'를 수행하여 부채 등급을 연도별로 정의합니다. 마지막으로 순위에 따라 결과를 분할합니다. 'split (df [,! "rank", with = F], df $ rank)' – jav

답변

1

여기에 dplyr 패키지를 사용하는 방법이 있습니다. 우리는 그룹 연도 별 데이터는 다음 그룹을 도시에 (이 분위수)를 나타내는 새 열을 만들어 우리가 할 수있는 다음 split을 새 그룹 열을 기준으로 데이터 세트까지 :.

library(dplyr) 
df <- df %>% group_by(year) %>% 
    mutate(group = cut(wealth, c(-Inf, quantile(wealth, c(1/3, 2/3)), Inf), 
        labels = 1:3)) 
split(df, df$group) 
# $`1` 
# Source: local data frame [2 x 4] 
# Groups: year [2] 

#  city year wealth group 
# <fctr> <int> <int> <fctr> 
# 1  a 2001  1  1 
# 2  c 2002  10  1 

# $`2` 
# Source: local data frame [2 x 4] 
# Groups: year [2] 

#  city year wealth group 
# <fctr> <int> <int> <fctr> 
# 1  b 2001  2  2 
# 2  b 2002  20  2 

# $`3` 
# Source: local data frame [2 x 4] 
# Groups: year [2] 

#  city year wealth group 
# <fctr> <int> <int> <fctr> 
# 1  a 2002  30  3 
# 2  c 2001  3  3 
관련 문제