【问题标题】:Create multiple data that count for unique values of each variables using dplyr and loop使用 dplyr 和循环创建多个数据,计算每个变量的唯一值
【发布时间】:2019-06-27 04:53:23
【问题描述】:

我对使用 dplyr 和 for 循环进行编程以创建多个数据有一些疑问。没有循环的代码效果很好,但是带有 for 循环的代码并没有给我预期的结果以及错误消息。

错误信息是这样的:

"UseMethod ("select_") 中的错误:没有适用于 'select_' 的方法 应用于“字符”类的对象

请任何人让我走上正确的道路。

下面的代码有效

B <- data %>% select (column1) %>% group_by (column1) %>% arrange (column1) %>% summarise (n = n ())

下面的代码不起作用

column_list <- c ('column1', 'column2', 'column3')

for (b in column_list) {

 a <- data %>% select (b) %>% group_by (b) %>% arrange (b) %>% summarise (n = n () )
 assign (paste0(b), a)
}

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    Don't use assign。而是使用列表。

    我们可以使用dplyr 中的_at 变体,它适用于字符变量。

    library(dplyr)
    
    split_fun <- function(df, col) {
      df %>% group_by_at(col) %>% summarise(n = n()) %>% arrange_at(col)
    }
    

    然后使用lapply/map 将其应用到不同的列

    purrr::map(column_list, ~split_fun(data, .))
    

    这将返回一个数据框列表,如果需要,可以单独使用[[ 访问这些数据框。


    使用mtcars 的示例

    df <- mtcars
    column_list <- c ('cyl', 'gear', 'carb')
    
    purrr::map(column_list, ~split_fun(df, .))
    
    #[[1]]
    # A tibble: 3 x 2
    #    cyl     n
    #  <dbl> <int>
    #1     4    11
    #2     6     7
    #3     8    14
    
    #[[2]]
    # A tibble: 3 x 2
    #   gear     n
    #  <dbl> <int>
    #1     3    15
    #2     4    12
    #3     5     5
    
    #[[3]]
    # A tibble: 6 x 2
    #   carb     n
    #  <dbl> <int>
    #1     1     7
    #2     2    10
    #3     3     3
    #4     4    10
    #5     6     1
    #6     8     1
    

    【讨论】:

    • 感谢您的评论。您的代码运行良好。我还有一个问题。你能给我额外的代码来在每个不同的数据中分配这些表吗?
    • @SangwonSteveLee 它已经在那里了。如果您分配值l1 &lt;- purrr::map(column_list, ~split_fun(data, .))。然后,您可以分别使用它们中的每一个。 l1[[1]]l1[[2]] 等等。
    • 感谢您的友好和清晰的解释。您的解决方案效果很好。
    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 2022-01-18
    • 2019-10-14
    • 2018-12-15
    • 1970-01-01
    • 2016-10-13
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多