R Dplyr Summarize w / Sum не считает некоторые строки.Зачем? - PullRequest
0 голосов
/ 21 марта 2019

Я новичок в stackoverflow, но не новичок в поиске проблем с моим R-скриптом.Это меня озадачило.

Я пытаюсь выяснить, почему мой текущий сценарий не работает:

СЦЕНАРИЙ: Мой пример - тиббл (называемый "Squishframe") из 13 столбцов (11 из них должны рассматриваться как символы и уникальные переменные; 2 из них должны быть числовыми).Я группирую по символьным столбцам и суммирую все остальные числовые столбцы, используя функции суммирования (и суммирования).Этот новый тиббл называется «Групповой кадр».

Основная проблема, как представляется, заключается в следующем:

  • при наличии строки с уникальными переменными И числовыми данными,
  • используется совместно с другой строкой с теми же уникальными переменными и пустыми числовыми данными,
  • строка с числовыми данными игнорируется!

    #Create pipeline that first turns the Squishframe number columns into numeric type, and then groups the data by the Text-based columns
    Groupedframe <- Squishframe %>% 
      mutate_at(vars(AF, Billable), funs(gsub("\\$", "", .))) %>%
      mutate_at(vars(AF, Billable), funs(as.numeric)) %>%
      group_by_at(vars(`File Name`, Source, Date, Colour, Size, MediumSource, Campaign, Version, Signed, CountryCode, State)) %>%
    
    #Summarize all non-text-based columns by groups (sum function used)
     summarize_all(funs(sum))
    

Если вы хотитев качестве примера - zip моих живых файлов, у меня они есть, но я не уверен, как предоставить их прямо сейчас.

Это немного отличается от моего выше, так как он импортируется из RawПапка с данными и помещает окончательный набор данных в выходную папку.


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

structure(list(`File Name` = c("Bricks.csv", "Bricks.csv", "Bricks.csv", 
"Bricks.csv", "Bricks.csv", "Bricks.csv", "Bricks.csv", "Bricks.csv", 
"Bricks.csv", "Bricks.csv", "Bricks.csv", "Bricks.csv", "Bricks.csv"
), Source = c("Installations", "Installations", "Installations", 
"Installations", "Installations", "Installations", "Installations", 
"Installations", "Installations", "Installations", "Installations", 
"Installations", "Installations"), Date = structure(c(17934, 
17934, 17934, 17934, 17945, 17953, 17956, 17957, 17945, 17945, 
17945, 17945, 17945), class = "Date"), Colour = c(NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Size = c(NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), MediumSource = c("Baliest", 
"Baliest", "Baliest", "Baliest", "Baliest", "Baliest", "Baliest", 
"Baliest", "Klimt", "Klimt", "Klimt", "Klimt", "Klimt"), Campaign = c("Big Campaign Baliest", 
"Big Campaign Baliest", "Big Campaign Baliest", "Big Campaign Baliest", 
"Big Campaign Baliest", "Big Campaign Baliest", "Big Campaign Baliest", 
"Big Campaign Baliest", "Big Campaign Klimt", "Big Campaign Klimt", 
"Big Campaign Klimt", "Big Campaign Klimt", "Big Campaign Klimt"
), Version = c("Creative_V2", "Creative_V1", "Creative_V3", "Creative_V2", 
"Creative_V1", "Creative_V3", "Creative_V2", "Creative_V1", "Creative_V1", 
"Creative_V1", "Creative_V1", "Creative_V1", "Creative_V1"), 
    Signed = c("Tigle iOS", "Tigle iOS", "Tigle iOS", "Tigle iOS", 
    "Tigle iOS", "Tigle iOS", "Tigle iOS", "Tigle iOS", "200289", 
    "200289", "200289", "200289", "200289"), CountryCode = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), State = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), AF = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Billable = c(NA, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, NA, NA, NA, NA)), row.names = c(NA, 
-13L), class = c("tbl_df", "tbl", "data.frame"))

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

Мой скрипт пытается сжать данные.Он должен объединять все числовые данные в строки, определенные ТОЛЬКО уникальными переменными.Другими словами, если в строке есть уникальные переменные, в этой строке должны храниться все числовые данные, а не исходное состояние, в котором имеется несколько строк с одинаковыми переменными.Я должен получить те же числовые итоги столбца, только с меньшим количеством строк.

Я должен получить результирующий кадр данных с суммой 8 в столбце «Оплачиваемый».И без дубликатов.

File Name   Source  Date    Colour  Size    MediumSource    Campaign    Version Signed  CountryCode State   AF  Billable
Bricks.csv  Installations   2/7/2019            Baliest Big Campaign Baliest    Creative_V1 Tigle iOS               1
Bricks.csv  Installations   2/7/2019            Baliest Big Campaign Baliest    Creative_V2 Tigle iOS               1
Bricks.csv  Installations   2/7/2019            Baliest Big Campaign Baliest    Creative_V3 Tigle iOS               1
Bricks.csv  Installations   2/18/2019           Baliest Big Campaign Baliest    Creative_V1 Tigle iOS               1
Bricks.csv  Installations   2/18/2019           Klimt   Big Campaign Klimt  Creative_V1 200289              1
Bricks.csv  Installations   2/26/2019           Baliest Big Campaign Baliest    Creative_V3 Tigle iOS               1
Bricks.csv  Installations   3/1/2019            Baliest Big Campaign Baliest    Creative_V2 Tigle iOS               1
Bricks.csv  Installations   3/2/2019            Baliest Big Campaign Baliest    Creative_V1 Tigle iOS               1

ТЕКУЩИЙ РЕЗУЛЬТАТ: По большей части, это успешно.Но у меня есть случай, когда скрипт, который успешно суммирует все остальные строки, игнорирует некоторые.Это означает, что некоторые числовые данные полностью игнорируются, несмотря на совместное использование переменных с другой строкой.Это приводит к потере данных.Я получаю меньше строк, но итоги столбцов меньше.Пробелы отображаются в столбце «Оплачиваемый», где должны быть данные для этой уникальной комбинации переменных.Я не пытаюсь удалить эти пробелы, эти пробелы должны быть 1 с:

File Name   Source  Date    Colour  Size    MediumSource    Campaign    Version Signed  CountryCode State   AF  Billable
Bricks.csv  Installations   2/7/2019            Baliest Big Campaign Baliest    Creative_V1 Tigle iOS               1
Bricks.csv  Installations   2/7/2019            Baliest Big Campaign Baliest    Creative_V2 Tigle iOS               
Bricks.csv  Installations   2/7/2019            Baliest Big Campaign Baliest    Creative_V3 Tigle iOS               1
Bricks.csv  Installations   2/18/2019           Baliest Big Campaign Baliest    Creative_V1 Tigle iOS               1
Bricks.csv  Installations   2/18/2019           Klimt   Big Campaign Klimt  Creative_V1 200289              
Bricks.csv  Installations   2/26/2019           Baliest Big Campaign Baliest    Creative_V3 Tigle iOS               1
Bricks.csv  Installations   3/1/2019            Baliest Big Campaign Baliest    Creative_V2 Tigle iOS               1
Bricks.csv  Installations   3/2/2019            Baliest Big Campaign Baliest    Creative_V1 Tigle iOS               1

Мне кажется, что суммирование пробела + 1 в этих случаях = пробел.Это должно быть 1. Текущий оплачиваемый столбец суммирует 6 вместо 8, как и должно быть.


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

1 Ответ

0 голосов
/ 22 марта 2019

Сумма Billable равна 8 с любой из этих реализаций.Поскольку вы редактировали вопрос несколько раз, возможно, вы захотите удалить и задать новый.

library(tidyverse)

res1 <- df %>% 
  mutate_at(vars(AF, Billable), ~ gsub("\\$", "", .)) %>% 
  mutate_at(vars(AF, Billable), ~ as.numeric(.)) %>%
  group_by_at(vars(`File Name`:State)) %>%
  summarize_all(~ sum(., na.rm = TRUE))
res1
#> # A tibble: 8 x 13
#> # Groups:   File Name, Source, Date, Colour, Size, MediumSource, Campaign,
#> #   Version, Signed, CountryCode [8]
#>   `File Name` Source Date       Colour Size  MediumSource Campaign Version
#>   <chr>       <chr>  <date>     <lgl>  <lgl> <chr>        <chr>    <chr>  
#> 1 Bricks.csv  Insta~ 2019-02-07 NA     NA    Baliest      Big Cam~ Creati~
#> 2 Bricks.csv  Insta~ 2019-02-07 NA     NA    Baliest      Big Cam~ Creati~
#> 3 Bricks.csv  Insta~ 2019-02-07 NA     NA    Baliest      Big Cam~ Creati~
#> 4 Bricks.csv  Insta~ 2019-02-18 NA     NA    Baliest      Big Cam~ Creati~
#> 5 Bricks.csv  Insta~ 2019-02-18 NA     NA    Klimt        Big Cam~ Creati~
#> 6 Bricks.csv  Insta~ 2019-02-26 NA     NA    Baliest      Big Cam~ Creati~
#> 7 Bricks.csv  Insta~ 2019-03-01 NA     NA    Baliest      Big Cam~ Creati~
#> 8 Bricks.csv  Insta~ 2019-03-02 NA     NA    Baliest      Big Cam~ Creati~
#> # ... with 5 more variables: Signed <chr>, CountryCode <lgl>, State <lgl>,
#> #   AF <dbl>, Billable <dbl>
sum(res1$Billable) == 8
#> [1] TRUE

res2 <- df %>%
  distinct() %>%
  filter(! is.na(Billable))
res2
#> # A tibble: 8 x 13
#>   `File Name` Source Date       Colour Size  MediumSource Campaign Version
#>   <chr>       <chr>  <date>     <lgl>  <lgl> <chr>        <chr>    <chr>  
#> 1 Bricks.csv  Insta~ 2019-02-07 NA     NA    Baliest      Big Cam~ Creati~
#> 2 Bricks.csv  Insta~ 2019-02-07 NA     NA    Baliest      Big Cam~ Creati~
#> 3 Bricks.csv  Insta~ 2019-02-07 NA     NA    Baliest      Big Cam~ Creati~
#> 4 Bricks.csv  Insta~ 2019-02-18 NA     NA    Baliest      Big Cam~ Creati~
#> 5 Bricks.csv  Insta~ 2019-02-26 NA     NA    Baliest      Big Cam~ Creati~
#> 6 Bricks.csv  Insta~ 2019-03-01 NA     NA    Baliest      Big Cam~ Creati~
#> 7 Bricks.csv  Insta~ 2019-03-02 NA     NA    Baliest      Big Cam~ Creati~
#> 8 Bricks.csv  Insta~ 2019-02-18 NA     NA    Klimt        Big Cam~ Creati~
#> # ... with 5 more variables: Signed <chr>, CountryCode <lgl>, State <lgl>,
#> #   AF <lgl>, Billable <int>
sum(res2$Billable) == 8
#> [1] TRUE
...