/ / Vytvorte funkciu na filtrovanie a sumarizáciu pomocou príkazov R - r, filtrovať, zoskupiť, dplyr, sumarizovať

Vykonať funkciu pre filtrovanie a zhrnúť pomocou R - r, filter, skupina-o, dplyr, zhrnúť

Mám tieto dva stoly;

   <A>                       <B>
a1    a2                     b1
ABC   CAFE                   AB
ABD   DRINK                  BF
ABF   CAFE                   ..
ABFF  DRINK
..     ..

Chcel by som poznať súhrnnú tabuľku obsahujúcu B až a1 v tabuľke A takto;

library(dplyr)
library(stringr)

A1 <- A %>%
filter(str_detect(a1, "AB")) %>%
group_by(a2) %>%
summarize(n())

A2 <- A %>%
filter(str_detect(a1, "BF")) %>%
group_by(a2) %>%
summarize(n())

Mal by som však vytvoriť kód niekoľkokrát, aby som chcel funkciu na vstup do tabuľky B vo funkcii str_detect ... Ako to urobím?

odpovede:

1 pre odpoveď č. 1

Tu som navrhol funkciu s názvom count_fun, ktorý má štyri argumenty. dat je dátový rámec ako A, Scol je stĺpec s reťazcami, Gcol je zoskupovací stĺpec a String je testovací reťazec. Pozri https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html naučiť sa, ako navrhnúť funkciu pomocou dplyr.

library(dplyr)
library(stringr)

count_fun <- function(dat, Scol, Gcol, String){

Scol <- enquo(Scol)
Gcol <- enquo(Gcol)

dat2 <- dat %>%
filter(str_detect(!!Scol, String)) %>%
group_by(!!Gcol) %>%
summarize(n())
return(dat2)
}

count_fun(A, a1, a2, "AB")
# # A tibble: 2 x 2
#   a2    `n()`
#   <chr> <int>
# 1 CAFE      2
# 2 DRINK     2

count_fun(A, a1, a2, "BF")
# # A tibble: 2 x 2
#   a2    `n()`
#   <chr> <int>
# 1 CAFE      1
# 2 DRINK     1

Potom môžeme podať žiadosť count_fun použitím lapply prechádzať všetky prvky v priečinku B.

lapply(B$b1, function(x){
count_fun(A, a1, a2, x)
})

# [[1]]
# # A tibble: 2 x 2
#   a2    `n()`
#   <chr> <int>
# 1 CAFE      2
# 2 DRINK     2
#
# [[2]]
# # A tibble: 2 x 2
#   a2    `n()`
#   <chr> <int>
# 1 CAFE      1
# 2 DRINK     1

DATA

A <- read.table(text = "a1    a2
ABC   CAFE
ABD   DRINK
ABF   CAFE
ABFF  DRINK
",
header = TRUE, stringsAsFactors = FALSE)

B <- data.frame(b1 = c("AB", "BF"), stringsAsFactors = FALSE)

1 pre odpoveď č. 2

Myslím, že to váš problém vyriešilo:

 lapply(B$b1,function(x)A%>%filter(str_detect(a1, x)) %>% group_by(a2) %>% summarize(n()))