Р: Как я могу преобразовать фрейм данных в относительные значения частоты для каждого столбца? - PullRequest
0 голосов
/ 05 апреля 2019

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

В качестве примера игрушек, пожалуйста, рассмотрите этот фрейм данных:

df<-data.frame(fruit=c('apple','apple','pear','orange','apple','pear'),
           price=c(47,92,87,14,21,19),
           town=c('home','far','close','close','close','far'))

В качестве цели данных я надеюсь получить результат:

goal<-data.frame(fruit=c(.50,.50,.33,.17,.5,.17),
                 price=c(.01,1.29,1.14,-0.93,-0.73,-0.79),
                 town=c(.17,.33,.50,.50,.50,.33))

В кадре данных цели я надеюсь масштабировать числовые столбцы, а столбцы с категориальными значениями преобразовывать в относительную частоту значения в столбце. Например, «яблоко» появляется для трех из шести записей в кадре данных, и поэтому .50 отражает 3/6 в столбце.

Я могу преобразовать переменную price и все числовые столбцы в моем фрейме данных в z-счет, используя:

newdf <- df %>%
         mutate_if(is.numeric,scale)

Это завершает мою цель для числовых столбцов, так как масштабированное значение более интересно для меня, чем число раз, когда появляется значение в непрерывном масштабе (большинство наборов, на которых я буду использовать это, имеют тонны десятичных знаков, и точных повторов там нет).

Я попытался использовать некоторые небольшие правки в коде, который нашел в этом ответе: dplyr: применить функцию table () к каждому столбцу data.frame , но я не смог достичь своей цели. Как я мог достичь желаемого результата?

Заранее спасибо!

1 Ответ

1 голос
/ 05 апреля 2019

Вот альтернатива

library(qdapTools) # for `lookup` function

df %>%
  mutate_if(is.numeric,scale) %>% 
  mutate_if(is.factor, function(x) lookup(x, as.data.frame(prop.table(table(x))))) %>% 
  round(2)
#   fruit price town
# 1  0.50  0.01 0.17
# 2  0.50  1.29 0.33
# 3  0.33  1.15 0.50
# 4  0.17 -0.93 0.50
# 5  0.50 -0.73 0.50
# 6  0.33 -0.79 0.33
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...