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