【问题标题】:Make a function to filter and summarize using R使用 R 制作一个过滤和汇总的函数
【发布时间】:2018-06-09 12:46:35
【问题描述】:

我有这两张表;

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

我想知道像这样在表A中包含B到a1的汇总表;

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())

但是,我应该多次编写代码,以便我想要一个函数在str_detect函数中输入B表......我如何制作这个函数?

【问题讨论】:

  • lapply(A$b1,function(x)A%&gt;%filter(str_detect(a1, x)) %&gt;% group_by(a2) %&gt;% summarize(n()))
  • 使用'function(x)A'对吗??
  • 为什么不呢? A 不是参数,它会从 .Globalenv 中调用 A。如果它不起作用,请尝试一下,它确信有人会给你一个正确的方法。lapply(B$b1,function(x)A%&gt;%filter(str_detect(a1, x)) %&gt;% group_by(a2) %&gt;% summarize(n()))
  • 是的!我现在要研究 lapply 函数

标签: r filter group-by dplyr summarize


【解决方案1】:

在这里我设计了一个名为count_fun 的函数,它有四个参数。 dat 是类似A 的数据框,Scol 是带有字符串的列,Gcol 是分组列,String 是测试字符串。请参阅https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html,了解如何使用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

然后我们可以使用lapply 应用count_fun 来循环遍历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

数据

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)

【讨论】:

  • 请问,我现在想获取汇总表的比例,而不是现在计算...然后我更改了count_fun函数,但它不起作用...我如何获得比例( %) 'function' 中的类型?
  • 这可能是一个新问题,但在您提出新问题之前,请先搜索 SO,看看是否有帖子谈论如何使用 dplyr 计算百分比。
【解决方案2】:

我想这解决了你的问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2021-11-16
    • 2021-12-13
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多