R Dplyr Summarize w/ Sum 不计算某些行。为什么?

R Dplyr Summarize w/ Sum is not counting some rows. Why?

我是 Whosebug 的新手,但对谷歌搜索我的 R 脚本问题并不陌生。这个让我难住了。

我正在尝试找出为什么我当前的脚本不起作用:

脚本: 我的示例是 13 列的小标题(称为 "Squishframe")(其中 11 列被视为字符和唯一变量;其中 2 列为数字)。我按字符列分组,并使用汇总(和求和)函数对所有其他数字列求和。这个新标题叫做 "Groupframe".

主要问题似乎是:

如果您想要我的实时文件的 zip 作为示例,我有它们,但我不确定现在如何提供它们。

和我上面的有点不同,它是从Raw Data文件夹导入,然后将最终数据集存入输出文件夹。


输入: 上面脚本中名为 "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"))

预期结果:

我的脚本试图压缩数据。它应该将所有数字数据合并到仅由唯一变量定义的行中。换句话说,如果一行具有唯一变量,则该行应存储所有数值数据,而不是其原始状态,即多行具有相同变量。我应该得到相同的数字列总计,只是行数更少。

我应该在 "Billable" 列中得到一个总和为 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

当前结果: 在大多数情况下,它是成功的。但我有一个案例,脚本愉快地对所有其他行求和,忽略了一些。这意味着一些数字数据被完全忽略,尽管与另一行共享变量。这会导致数据丢失。我得到的行数较少,但列总数较少。 "Billable" 列中出现空白,其中应该有这些唯一变量组合的数据。我不是要删除这些空白,这些空白应该是 1s:

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

对我来说,在这些情况下求和 blank+1 似乎 = blank。它应该是 1。当前的计费列总和为 6,而不是前面提到的 8。


谢谢大家的宝贵时间!我非常感谢对我的脚本和我的编写方法的任何反馈 post。如果可以以任何方式改进,我愿意接受!

在这两种实现中,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