Как правильно реализовать функцию суммирования через пакет dplyr с использованием файла excel (xlsx) (язык R)? - PullRequest
0 голосов
/ 08 июля 2020

Я работаю над проектом по работе, и хотя в настоящее время мы используем Excel для анализа данных, я пытаюсь перейти на R, как я считаю из своего прошлого опыта, это окажется гораздо более полезным и эффективным в долгосрочной перспективе. . Я прикрепил два изображения: одно показывает необработанные данные, которые используются, а другое показывает конечный результат, который я хочу получить через сводную таблицу Excel. Обратите внимание, я изменил имена из соображений конфиденциальности. Изменить: я понимаю, что результат в Excel не имеет одинаковых размеров, как в выходных данных функции суммирования, следует ли использовать другую функцию? В противном случае я добавил третье изображение, которое может быть более реалистичным. Исходные данные Предпочтительный результат в Excel Второй результат

Вот код, который я написал до сих пор (импорт и создание фрейма данных. Mutating et c. Был успешным, поэтому я не включил его, а rd_data1 - исходные данные, импортированные без изменений):

rd_analysis2 <- rd_data1 %>%

  select('Employee Name', 'Month', 'Customer Name', 'Service Type', 'Number of Points', 'Actual Time Spent(min)', 'Work Order') %>%
    group_by('Employee Name', 'Month', 'Customer Name', 'Service Type') %>%
      summarise(Total_Points = sum('Number of Points', na.rm=TRUE), Total_Time = sum('Actual Time Spent(min)'), distinct_work_orders = n_distinct('Work Order')) %>%
        arrange('Employee Name', 'Month')

Я либо получаю сообщения об ошибках с функцией суммирования, говорящей «Ошибка: проблема с summarise() вводом Total_Points. X недопустимый 'тип' (символ) аргумента», либо получаю странный результат, который объединяет все точки и время, но не сгруппированы как хотелось бы. Мы будем очень благодарны за любые указатели или советы, так как я немного заржавел, поэтому, пожалуйста, простите меня, если я ошибаюсь в своем синтаксисе.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

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

rd_analysis2 <- rd_data1 %>%
  select(`Employee Name`, `Month`, `Customer Name`, `Service Type`, `Number of Points`, `Actual Time Spent(min)`, `Work Order`) %>%
  group_by(`Employee Name`, `Month`, `Customer Name`, `Service Type`) %>%
  summarise(
    Total_Points = sum(`Number of Points`, na.rm=TRUE),
    Total_Time = sum(`Actual Time Spent(min)`),
    distinct_work_orders = n_distinct(`Work Order`),

    .groups = 'drop'
  ) %>%
  arrange(`Employee Name`, `Month`)
0 голосов
/ 08 июля 2020

Похоже, ваши типы данных не могут быть числовыми c. Следовательно, часть сообщения об ошибке invalid 'type' (character).

Один из способов проверить ваши типы данных (в R есть много способов, этот пост R-bloggers охватывает несколько других вариантов) - через summary и glimpse.

Применение их к встроенному набору данных starwars:

library(dplyr)
data(starwars)
summary(starwars)

     name               height           mass          hair_color         skin_color
Length:87          Min.   : 66.0   Min.   :  15.00   Length:87          Length:87
Class :character   1st Qu.:167.0   1st Qu.:  55.60   Class :character   Class :character
Mode  :character   Median :180.0   Median :  79.00   Mode  :character   Mode  :character
                   Mean   :174.4   Mean   :  97.31
                   3rd Qu.:191.0   3rd Qu.:  84.50
                   Max.   :264.0   Max.   :1358.00
                   NA's   :6       NA's   :28

glimpse(starwars)

Observations: 87
Variables: 13
$ name       <chr> "Luke Skywalker", "C-3PO", "R2-D2", "Darth Vader", "Leia Organa",...
$ height     <int> 172, 167, 96, 202, 150,...
$ mass       <dbl> 77.0, 75.0, 32.0, 136.0, 49.0,...
$ hair_color <chr> "blond", NA, NA, "none", "brown",...
$ skin_color <chr> "fair", "gold", "white, blue", "white",...

Это показывает четкую разницу между символьными и числовыми типами данных c в набор данных. Если столбец вашего набора данных должен быть числовым c, но был сохранен как текст, вы можете использовать as.numeric для его преобразования.

Например, сравните следующие результаты

# make a column incorrectly character
starwars2 = starwars %>% mutate(mass = as.character(mass))
# view incorrect data
glimpse(starwars2)
# view corrected data
glimpse(starwars2 %>% mutate(mass = as.numeric(mass)))
...