使用dplyr和循环创建多个计算每个变量的唯一值的数据

时间:2019-06-27 04:53:23

标签: r dplyr

我对于使用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)
}

1 个答案:

答案 0 :(得分:1)

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

我们可以在_at中使用dplyr变体,该变体与字符变量一起使用。

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