Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用purrr函数或循环自动执行dplyr函数调用_R_Dplyr_Purrr - Fatal编程技术网

如何使用purrr函数或循环自动执行dplyr函数调用

如何使用purrr函数或循环自动执行dplyr函数调用,r,dplyr,purrr,R,Dplyr,Purrr,我正在尝试自动化一个函数调用,这样我就可以通过在因变量(如x、y和z)中旋转,并使用分组变量(如年份和种族)的各种组合,或者分别使用年份、种族和城市,来生成一个数据帧 更详细地说 在我的最小示例中,我有三个因变量,x,y,z。我还有几个分组变量。对于每个呼叫,我需要计算1的数量。我还需要添加一个新列,其中包含反映所使用的因变量的字符串值 当我指定两个分组变量和因变量时,我能够编写一个生成计数的函数。在实际问题中,对于十几个因变量中的每一个,我必须以多种不同的方式进行分组。我可能有一个、两个或三个

我正在尝试自动化一个函数调用,这样我就可以通过在因变量(如x、y和z)中旋转,并使用分组变量(如年份和种族)的各种组合,或者分别使用年份、种族和城市,来生成一个数据帧

更详细地说

在我的最小示例中,我有三个因变量,x,y,z。我还有几个分组变量。对于每个呼叫,我需要计算1的数量。我还需要添加一个新列,其中包含反映所使用的因变量的字符串值

当我指定两个分组变量和因变量时,我能够编写一个生成计数的函数。在实际问题中,对于十几个因变量中的每一个,我必须以多种不同的方式进行分组。我可能有一个、两个或三个分组变量。 在函数之外,我添加了character列,该列提供变量的信息。我认为在函数中应该有一个case_when()语句,它表示如下内容:

case_when({{var1}} == 'x' ~ "This is the first",  
{{var1}} == 'y' ~ "Second one",  
{{var1}} == 'z' ~ "Third shot")  
然后我使用rbind合并我的结果

我有一个工作函数,我可以添加字符串列

我的最终结果需要一个数据帧。我正在培训最终用户,一个初学者程序员,使用我的代码。因此,简单性是首选,即使这意味着使用一些函数

我读到:

但是,我不知道如何自动化这个过程,以便不同的用户可以执行一个函数调用(或者两个或三个)。如果我以交互方式这样做,将会有数百个变量的组合。 我假设这可以通过循环或purr函数实现,但我无法理解

library(tidyverse)  
set.seed(2021)  
numRows = 1000

df1 = data.frame(year = sample(2010:2013, size = numRows, replace = TRUE),
             race = sample(c('white', 'black', 'Asian', 'Hispanic'), size = numRows, replace = TRUE),
             city = sample(c('Oakland', 'Berkeley','Fremont'), size = numRows, replace = TRUE),
             young = sample(c(1,2,NA), size = numRows, replace = TRUE),
             old = sample(c(1,2,NA), size = numRows, replace = TRUE),
             x = sample(x = c(1,2, NA), size = numRows, replace = TRUE, prob = c(.7, .2, .1)),
             y = sample(x = c(1,2, NA), size = numRows, replace = TRUE, prob = c(.7, .2, .1)),
             z = sample(x = c(1,2, NA), size = numRows, replace = TRUE, prob = c(.7, .2, .1)))

df1$year = factor(df1$year)
df1$race = factor(df1$race)
df1$city = factor(df1$city)

# Working code
compute_num02 = function(grp1, grp2, var1) {
res_num = df1 %>%
filter(!is.na({{var1}}), {{var1}} == 1  )  %>%  
group_by({{grp1}}, {{grp2}}, .drop = FALSE) %>% summarize(counts = n()) %>% 
select({{grp1}},{{grp2}},counts) %>% as.data.frame()
res_num 
}

# Completing the code interactively
res1 = compute_num02(year, city,x)
res1$Note = "This is the first"

res2 = compute_num02(year, city,y)
res2$Note = "Second one"

res3 = compute_num02(year, city,z)
res3$Note = "Third shot"
result_final = rbind(res1,res2,res3)
result_final

如果我们想以带引号或不带引号的形式通过,我们可以使用
ensym
转换为符号并计算(
!!
)。在这里,我们仅更改“var1”部分,分组列也可以更改(如果我们要循环1个以上的输入,请使用
map2
(对于2个变量输入)或
pmap
(对于>=2))

-输出

#   Note year     city counts
#1     1 2010 Berkeley     62
#2     1 2010  Fremont     58
#3     1 2010  Oakland     57
#4     1 2011 Berkeley     47
#5     1 2011  Fremont     48
#6     1 2011  Oakland     54
#7     1 2012 Berkeley     55
#8     1 2012  Fremont     70
#9     1 2012  Oakland     48
#10    1 2013 Berkeley     52
#11    1 2013  Fremont     61
#12    1 2013  Oakland     65
#13    2 2010 Berkeley     66
#14    2 2010  Fremont     62
#15    2 2010  Oakland     56
#16    2 2011 Berkeley     55
#17    2 2011  Fremont     55
#18    2 2011  Oakland     55
#19    2 2012 Berkeley     51
#20    2 2012  Fremont     65
#21    2 2012  Oakland     48
#22    2 2013 Berkeley     44
#23    2 2013  Fremont     54
#24    2 2013  Oakland     71
#25    3 2010 Berkeley     67
#26    3 2010  Fremont     63
#27    3 2010  Oakland     49
#28    3 2011 Berkeley     59
#29    3 2011  Fremont     60
#30    3 2011  Oakland     59
#31    3 2012 Berkeley     61
#32    3 2012  Fremont     64
#33    3 2012  Oakland     43
#34    3 2013 Berkeley     47
#35    3 2013  Fremont     58
#36    3 2013  Oakland     64

如果我们想以带引号或不带引号的形式通过,我们可以使用
ensym
转换为符号并计算(
!!
)。在这里,我们仅更改“var1”部分,分组列也可以更改(如果我们要循环1个以上的输入,请使用
map2
(对于2个变量输入)或
pmap
(对于>=2))

-输出

#   Note year     city counts
#1     1 2010 Berkeley     62
#2     1 2010  Fremont     58
#3     1 2010  Oakland     57
#4     1 2011 Berkeley     47
#5     1 2011  Fremont     48
#6     1 2011  Oakland     54
#7     1 2012 Berkeley     55
#8     1 2012  Fremont     70
#9     1 2012  Oakland     48
#10    1 2013 Berkeley     52
#11    1 2013  Fremont     61
#12    1 2013  Oakland     65
#13    2 2010 Berkeley     66
#14    2 2010  Fremont     62
#15    2 2010  Oakland     56
#16    2 2011 Berkeley     55
#17    2 2011  Fremont     55
#18    2 2011  Oakland     55
#19    2 2012 Berkeley     51
#20    2 2012  Fremont     65
#21    2 2012  Oakland     48
#22    2 2013 Berkeley     44
#23    2 2013  Fremont     54
#24    2 2013  Oakland     71
#25    3 2010 Berkeley     67
#26    3 2010  Fremont     63
#27    3 2010  Oakland     49
#28    3 2011 Berkeley     59
#29    3 2011  Fremont     60
#30    3 2011  Oakland     59
#31    3 2012 Berkeley     61
#32    3 2012  Fremont     64
#33    3 2012  Oakland     43
#34    3 2013 Berkeley     47
#35    3 2013  Fremont     58
#36    3 2013  Oakland     64
#   Note year     city counts
#1     1 2010 Berkeley     62
#2     1 2010  Fremont     58
#3     1 2010  Oakland     57
#4     1 2011 Berkeley     47
#5     1 2011  Fremont     48
#6     1 2011  Oakland     54
#7     1 2012 Berkeley     55
#8     1 2012  Fremont     70
#9     1 2012  Oakland     48
#10    1 2013 Berkeley     52
#11    1 2013  Fremont     61
#12    1 2013  Oakland     65
#13    2 2010 Berkeley     66
#14    2 2010  Fremont     62
#15    2 2010  Oakland     56
#16    2 2011 Berkeley     55
#17    2 2011  Fremont     55
#18    2 2011  Oakland     55
#19    2 2012 Berkeley     51
#20    2 2012  Fremont     65
#21    2 2012  Oakland     48
#22    2 2013 Berkeley     44
#23    2 2013  Fremont     54
#24    2 2013  Oakland     71
#25    3 2010 Berkeley     67
#26    3 2010  Fremont     63
#27    3 2010  Oakland     49
#28    3 2011 Berkeley     59
#29    3 2011  Fremont     60
#30    3 2011  Oakland     59
#31    3 2012 Berkeley     61
#32    3 2012  Fremont     64
#33    3 2012  Oakland     43
#34    3 2013 Berkeley     47
#35    3 2013  Fremont     58
#36    3 2013  Oakland     64