Программа R, работающая с пропущенными значениями (аналогично применению функции в Python) - PullRequest
0 голосов
/ 17 декабря 2018

Я новичок в программе 'R' и сейчас хочу разобраться с пропущенными значениями.По сути, у меня есть набор данных с несколькими столбцами, и в столбце «Покупка» отсутствуют значения.

Я хочу рассчитать среднее значение значений Покупки на основе столбца «Master_Category» для отсутствующих значений.

(код Python)

# generate missing Purchase values    
miss_Purch_rows = dataset['Purchase'].isnull()

# Check Purchase values from the grouping by the newly created Master_Product_Category column
categ_mean = dataset.groupby(['Master_Product_Category'])['Purchase'].mean()

# Impute mean Purchase value based on Master_Product_Category column
dataset.loc[miss_Purch_rows,'Purchase'] = dataset.loc[miss_Purch_rows,'Master_Product_Category'].apply(lambda x: categ_mean.loc[x])

Я ищу аналогичный код в «R-программе» для расчета недостающих значений по среднему значению и для другого столбца.

Пример данныхиз набора данных выглядит следующим образом:

   User_ID Product_ID    Gender Age  Occupation   Marital_Status Master_Category Purchase
1  1000001  P00000142      F 0-17         10              0             345    13650
2  1000001  P00004842      F 0-17         10              0            3412    13645
3  1000001  P00025442      F 0-17         10              0             129    15416
4  1000001  P00051442      F 0-17         10              0            8170     9938
5  1000001  P00051842      F 0-17         10              0             480     2849
6  1000001  P00057542      F 0-17         10              0             345       NA
7  1000001  P00058142      F 0-17         10              0            3412    11051
8  1000001  P00058242      F 0-17         10              0            3412       NA
9  1000001  P00059442      F 0-17         10              0            6816    16622
10 1000001  P00064042      F 0-17         10              0            3412     8190

Я пытался;

with(dataset, sapply(X = Purchase, INDEX = Master_Category, FUN = mean, na.rm = TRUE))

Но, похоже, не работает.

1 Ответ

0 голосов
/ 17 декабря 2018

Этот тип групповой операции обычно легко выполнить с помощью набора пакетов tidyverse :

Сначала мы читаем в вашем примере данные:

txt <- 'User_ID Product_ID    Gender Age  Occupation   Marital_Status Master_Category Purchase
1000001  P00000142      F 0-17         10              0             345    13650
1000001  P00004842      F 0-17         10              0            3412    13645
1000001  P00025442      F 0-17         10              0             129    15416
1000001  P00051442      F 0-17         10              0            8170     9938
1000001  P00051842      F 0-17         10              0             480     2849
1000001  P00057542      F 0-17         10              0             345       NA
1000001  P00058142      F 0-17         10              0            3412    11051
1000001  P00058242      F 0-17         10              0            3412       NA
1000001  P00059442      F 0-17         10              0            6816    16622
1000001  P00064042      F 0-17         10              0            3412     8190'

df <- read.table(text = txt, header = T)

Затем мы группируем по «Master_Category» и заполняем любые значения NA средним значением группы, используя ifelse внутри mutate:

library(tidyverse)

df.new <- df %>% 
  group_by(Master_Category) %>% 
  mutate(Purchase = ifelse(is.na(Purchase), mean(Purchase, na.rm = T), Purchase))

   User_ID Product_ID Gender Age   Occupation Marital_Status Master_Category Purchase
     <int> <fct>      <lgl>  <fct>      <int>          <int>           <int>    <dbl>
 1 1000001 P00000142  FALSE  0-17          10              0             345    13650
 2 1000001 P00004842  FALSE  0-17          10              0            3412    13645
 3 1000001 P00025442  FALSE  0-17          10              0             129    15416
 4 1000001 P00051442  FALSE  0-17          10              0            8170     9938
 5 1000001 P00051842  FALSE  0-17          10              0             480     2849
 6 1000001 P00057542  FALSE  0-17          10              0             345    13650
 7 1000001 P00058142  FALSE  0-17          10              0            3412    11051
 8 1000001 P00058242  FALSE  0-17          10              0            3412    10962
 9 1000001 P00059442  FALSE  0-17          10              0            6816    16622
10 1000001 P00064042  FALSE  0-17          10              0            3412     8190
...