Создайте новую переменную и присвойте значение группе - PullRequest
0 голосов
/ 05 октября 2018

У меня есть отметка о 65524 наблюдениях, где одна переменная является идентификатором для домохозяйства, а другая является фактором, где присваивается значение 1, если возраст человека в домохозяйстве составляет менее 15 лет,2 назначается, если возраст составляет от 15 до 64 лет, и 3 назначается, если возраст человека составляет 65 лет или старше.Таблетка выглядит следующим образом

> head(df, 15)
# A tibble: 15 x 2
   hh.id age.cat  
   <dbl> <dbl+lbl>
 1 11009 2        
 2 11009 2        
 3 11009 2        
 4 11009 2        
 5 11009 2        
 6 11009 1        
 7 11009 1        
 8 11009 1        
 9 11018 2        
10 11018 1        
11 11018 1        
12 11018 1        
13 11018 1        
14 11018 2        
15 11018 2

Мне нужно создать переменную для оценки коэффициента зависимости каждого домохозяйства.Что-то похожее на это

 > head(df, 15)
# A tibble: 15 x 3
   hh.id age.cat  dep.ratio
   <dbl> <dbl+lbl><dbl>
 1 11009 2        0.60
 2 11009 2        0.60
 3 11009 2        0.60
 4 11009 2        0.60
 5 11009 2        0.60
 6 11009 1        0.60
 7 11009 1        0.60
 8 11009 1        0.60
 9 11018 2        1.25
10 11018 1        1.25
11 11018 1        1.25
12 11018 1        1.25
13 11018 1        1.25
14 11018 2        1.25
15 11018 2        1.25

Я думал, что использование dplyr::mutate и dplyr::group_by будет работать

df <- df %>%
  dplyr::group_by(hh.id) %>%
  dplyr::mutate(dep.ratio = (length(which(df$age.cat == 1)) + length(which(df$age.cat == 3)))/length(which(df$age.cat == 2)))

Однако я не получаю оценки для каждой группы (то есть для каждой), но я получаю общий коэффициент зависимости для всей выборки, повторяемый для каждого наблюдения.

# A tibble: 15 x 3
# Groups:   hh.id [2]
   hh.id age.cat   dep.ratio
   <dbl> <dbl+lbl>     <dbl>
 1 11009 2              1.02
 2 11009 2              1.02
 3 11009 2              1.02
 4 11009 2              1.02
 5 11009 2              1.02
 6 11009 1              1.02
 7 11009 1              1.02
 8 11009 1              1.02
 9 11018 2              1.02
10 11018 1              1.02
11 11018 1              1.02
12 11018 1              1.02
13 11018 1              1.02
14 11018 2              1.02
15 11018 2              1.02

Затем я подумал об использовании tapply, но я не мог написать функцию, которая обуславливает значенияhh.id.Наконец, я также попробовал aggregate, но безуспешно.

Любые предложения приветствуются.

Спасибо

Маноло

1 Ответ

0 голосов
/ 05 октября 2018

Вот вариант:

ratiodf<- df %>% group_by(hh.id,age.cat) %>% 
  summarize(n=n()) %>% 
  spread(age.cat,n) %>% 
  mutate(ratio=(`1`+`3`)/`2`)

Это даст вам что-то вроде этого:

# A tibble: 2 x 4
# Groups:   hh.id [2]
  hh.id   `1`   `2` ratio
  <int> <int> <int> <dbl>
1 11009     3     5  0.6 
2 11018     4     3  1.33

Если вам нужно сохранить данные из исходного df (например, из других столбцов), вы можете продолжить с left_join:

left_join(df, ratiodf[,c(-2:-3)], by="hh.id")

, что приведет к этому:

   hh.id age.cat    ratio
1  11009       2 0.600000
2  11009       2 0.600000
3  11009       2 0.600000
4  11009       2 0.600000
5  11009       2 0.600000
6  11009       1 0.600000
7  11009       1 0.600000
8  11009       1 0.600000
9  11018       2 1.333333
10 11018       1 1.333333
11 11018       1 1.333333
12 11018       1 1.333333
13 11018       1 1.333333
14 11018       2 1.333333
15 11018       2 1.333333

Причина, по которой ваш код не работает, состоит в том, что, как только вы положили в базуформат df$hh.id и т. д., вы обходите группировку Tidyverse и получаете полный столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...