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