R Dplyr Summarize w/ Sum 不计算某些行。为什么?
R Dplyr Summarize w/ Sum is not counting some rows. Why?
我是 Whosebug 的新手,但对谷歌搜索我的 R 脚本问题并不陌生。这个让我难住了。
我正在尝试找出为什么我当前的脚本不起作用:
脚本:
我的示例是 13 列的小标题(称为 "Squishframe")(其中 11 列被视为字符和唯一变量;其中 2 列为数字)。我按字符列分组,并使用汇总(和求和)函数对所有其他数字列求和。这个新标题叫做 "Groupframe".
主要问题似乎是:
- 当有一行包含唯一变量和数字数据时,
- 与具有相同唯一变量和空白数字数据的另一行共享,
数值数据行被忽略!
#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 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
我是 Whosebug 的新手,但对谷歌搜索我的 R 脚本问题并不陌生。这个让我难住了。
我正在尝试找出为什么我当前的脚本不起作用:
脚本: 我的示例是 13 列的小标题(称为 "Squishframe")(其中 11 列被视为字符和唯一变量;其中 2 列为数字)。我按字符列分组,并使用汇总(和求和)函数对所有其他数字列求和。这个新标题叫做 "Groupframe".
主要问题似乎是:
- 当有一行包含唯一变量和数字数据时,
- 与具有相同唯一变量和空白数字数据的另一行共享,
数值数据行被忽略!
#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 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