r - классификация непрерывных данных по существующим группам - PullRequest
0 голосов
/ 01 мая 2018

Я относительный новичок в R, и у меня есть серия социально-экономических показателей (SES) переписи населения за 5-летний период, и я пытаюсь классифицировать оценки SES каждого года по трем категориям: «Высокий», «Среднее» и «Низкое» без необходимости поднабора данных.

     CT_ID_10 year SESindex SESindex_z SEStercile
1 42101009400 2012 11269.54 -1.0445502         NA
2 42101009400 2013 11633.63 -1.0256920         NA
3 42101009400 2014 15773.60 -0.8112616         NA
4 42101009400 2015 15177.28 -0.8421481         NA
5 42101009400 2016 21402.55 -0.5197089         NA
6 42101014000 2012 21448.06 -0.5173519         NA

Я хочу использовать среднее и стандартное отклонения в качестве моих точек отсечения (т. Е. Все, что выше среднего (x [в год]) + sd (x [в год]), является «высоким», а все, что ниже среднего (x [ в год]) - sd (x [в год]) - "Низкий". Я попробовал следующий код:

for (year in 2012:2016) {
  df$SEStercile <- ifelse(df$SESindex_z[which(df$year==year)] > (mean(df$SESindex_z[which(df$year==year)])+sd(df$SESindex_z[which(df$year==year)])), "HIGH",
  ifelse(df$SESindex_z[which(df$year==year)] < (mean(df$SESindex_z[which(df$year==year)])-sd(df$SESindex_z[which(df$year==year)])), "LOW","MEDIUM"))
}

Однако я получил следующую ошибку:

Error in `$<-.data.frame`(`*tmp*`, "SEStercile", value = c("LOW", "LOW", :  
replacement has 367 rows, data has 1839

Любой совет или простые функции будут с благодарностью!

1 Ответ

0 голосов
/ 01 мая 2018

В этом решении используется dplyr. Здесь я создаю фрейм данных со случайными данными для демонстрационных целей:

df <- data.frame(year = sample(2010:2018, 100, replace = TRUE),
                 z = runif(100))

Далее я группирую по годам и делаю вырезки, используя стандартные отклонения. Затем я разгруппирую полученный тибл.

df %>% 
  group_by(year) %>% 
  mutate(category = cut(z, 
                        breaks = c(-Inf, mean(z) - sd(z), mean(z) + sd(z), Inf),
                        labels = c("Low", "Medium", "High"))) %>% 
  ungroup

Результат выглядит примерно так (например, для 2010 года):

# # A tibble: 11 x 3
#      year     z category
#     <int> <dbl> <fct>   
# 1   2010 0.585 Medium  
# 2   2010 0.951 High    
# 3   2010 0.747 Medium  
# 4   2010 0.802 Medium  
# 5   2010 0.673 Medium  
# 6   2010 0.662 Medium  
# 7   2010 0.102 Low     
# 8   2010 0.129 Low     
# 9   2010 0.934 High    
# 10  2010 0.270 Medium  
# 11  2010 0.270 Medium 

Ваш код может выглядеть так:

df %>% 
  group_by(year) %>% 
  mutate(SEStercile = cut(SESindex_z,
                          breaks = c(-Inf, mean(SESindex_z) - sd(SESindex_z), mean(SESindex_z) + sd(SESindex_z), Inf),
                          labels = c("Low", "Medium", "High"))) %>% 
  ungroup
...