Нужна помощь в реализации формулы нормализации в выбранных столбцах фрейма данных в R - PullRequest
1 голос
/ 27 февраля 2020

Я делаю личный проект с городскими данными, я застрял в том месте, где мне нужно нормализовать данные, чтобы применить кластеризацию k-средних. Я немного покопался и нашел эту формулу здесь:

enter image description here Вот воспроизводимый пример

options(scipen = 999)
tract_per_complaints <- data.frame(
                      tract= c(7354, 5036, 17406, 5675, 2354),
                      fire= c(32, 0, 3, 78, 9),
                      flood= c(1, 25, 6, 8,7),
                      noise= c(56, 67, 0, 0, 1), 
                      total_complaints_at_this_tract= c(89, 92, 9, 86, 17),
                      population_at_this_tract= c(34134, 103849, 345300, 43535, 2143767)
                    )

#   tract fire flood noise total_complaints_at_this_tract population_at_this_tract
#1  7354   32     1    56                            89                    34134
#2  5036    0    25    67                            92                   103849
#3 17406    3     6     0                             9                   345300
#4  5675   78     8     0                            86                    43535
#5  2354    9     7     1                            17                  2143767

Поэтому я хотел применить приведенную выше формулу к ячейкам только с жалобами tract_per_complaints[ ,2:4]. Поэтому я создал вложенный for l oop, который не работал. Затем применил функцию sweep() следующим образом:

sweep(tract_per_complaints[ ,c(2:4)], 1, FUN="/", tract_per_complaints$population_at_this_tract)

#wrong output
#            fire         flood           noise
#1 0.000937481690 0.00002929630 0.0016405929572
#2 0.000000000000 0.00024073414 0.0006451675028
#3 0.000008688097 0.00001737619 0.0000000000000
#4 0.001791661881 0.00018376019 0.0000000000000
#5 0.000004198217 0.00000326528 0.0000004664686

К сожалению, это была моя лучшая попытка решить проблему, любой намек или подобный вопрос был бы полезен? Я посмотрел на них: Нормализация только одного столбца в кадре данных

Нормализация столбцов в R в соответствии с формулой

Необходимость помогите реализовать функцию в R

Как использовать функцию «развертки»

Спасибо!

1 Ответ

1 голос
/ 27 февраля 2020

Я не уверен, что sweep является правильным инструментом здесь, так как у вас еще нет сводной статистики c, чтобы сметать. Вы можете сделать это с помощью apply:

apply(tract_per_complaints[ ,c(2:4)], 2, 
      FUN=function(v, p) { v * p / sum(v * p)}, 
      p = tract_per_complaints$population_at_this_tract)

Вывод:

          fire       flood     noise
[1,] 0.04401224 0.001701866 0.1735655
[2,] 0.00000000 0.129443578 0.6317793
[3,] 0.04174017 0.103296596 0.0000000
[4,] 0.13682627 0.017364677 0.0000000
[5,] 0.77742131 0.748193282 0.1946551

В качестве альтернативы вы также можете посмотреть на dplyr::mutate_at.

...