以编程方式选择将哪些变量放入 dplyr 管道
Programmatically choosing which variables to put into dplyr pipe
我正在处理数据集(来自智能手机体验抽样),我必须在其中非常频繁地执行分组操作(例如查找每个人或每个人每天的度量的可变性等)。典型的代码可能类似于下面的代码,它计算某些变量的日内变异性,然后取日内变异性的平均值并将其与原始数据连接。
output <- group_by(mydata, id, day) %>%
mutate_at(vars(angr, sad, guil, anx, hap), funs(sd(., na.rm = TRUE))) %>%
ungroup() %>%
group_by(id) %>%
summarize_at(vars(angr, sad, guil, anx, hap), funs('var_day_mean' = mean(., na.rm = TRUE))) %>%
join(mydata, .)
我想要做的是能够将它保存为一个函数,这样我就可以调用这段代码(并且它的细微变化保存为不同的,而不必多次输入 angr, sad, guil, anx, hap
函数)在字符串中变量名称的向量上。所以所需的功能是:
vars <- c('angr', 'sad', 'guil', 'anx', 'hap')
output <- myfunc(vars)
其中 myfunc 执行上面的管道操作。
我知道有一个使用 dplyr 进行非标准评估的小插图,但它非常有限,没有涵盖 mutate 或我需要对这个用例做的大部分事情,所以希望有任何见解。
可重现的例子 - 我想要的基本上是下面的代码工作,但目前 dplyr 管道不能像我输入的那样将 vars 作为字符向量。
编辑:我错了——下面的代码确实有效,而且 dplyr 可以以这种方式运行(并且还可以将字符向量转换为 group_by,这使得编程变得容易)。我将下面的代码作为(工作)参考。
data <- data.frame('ID' = rep(1:10, each = 10),
'day' = rep(c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2), 10),
'anx' = rnorm(100), 'sad' = rnorm(100), 'hap' = rnorm(100))
vars = c('anx', 'sad', 'hap')
out <- group_by(data, ID, day) %>%
mutate_at(vars, funs(sd(., na.rm = TRUE)))
使用 mutate_at
您可以简单地提供列的名称作为向量:
mtcars %>% mutate_at(c("mpg", "hp"), funs(mean))
这应该可以解决问题。
我正在处理数据集(来自智能手机体验抽样),我必须在其中非常频繁地执行分组操作(例如查找每个人或每个人每天的度量的可变性等)。典型的代码可能类似于下面的代码,它计算某些变量的日内变异性,然后取日内变异性的平均值并将其与原始数据连接。
output <- group_by(mydata, id, day) %>%
mutate_at(vars(angr, sad, guil, anx, hap), funs(sd(., na.rm = TRUE))) %>%
ungroup() %>%
group_by(id) %>%
summarize_at(vars(angr, sad, guil, anx, hap), funs('var_day_mean' = mean(., na.rm = TRUE))) %>%
join(mydata, .)
我想要做的是能够将它保存为一个函数,这样我就可以调用这段代码(并且它的细微变化保存为不同的,而不必多次输入 angr, sad, guil, anx, hap
函数)在字符串中变量名称的向量上。所以所需的功能是:
vars <- c('angr', 'sad', 'guil', 'anx', 'hap')
output <- myfunc(vars)
其中 myfunc 执行上面的管道操作。
我知道有一个使用 dplyr 进行非标准评估的小插图,但它非常有限,没有涵盖 mutate 或我需要对这个用例做的大部分事情,所以希望有任何见解。
可重现的例子 - 我想要的基本上是下面的代码工作,但目前 dplyr 管道不能像我输入的那样将 vars 作为字符向量。
编辑:我错了——下面的代码确实有效,而且 dplyr 可以以这种方式运行(并且还可以将字符向量转换为 group_by,这使得编程变得容易)。我将下面的代码作为(工作)参考。
data <- data.frame('ID' = rep(1:10, each = 10),
'day' = rep(c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2), 10),
'anx' = rnorm(100), 'sad' = rnorm(100), 'hap' = rnorm(100))
vars = c('anx', 'sad', 'hap')
out <- group_by(data, ID, day) %>%
mutate_at(vars, funs(sd(., na.rm = TRUE)))
使用 mutate_at
您可以简单地提供列的名称作为向量:
mtcars %>% mutate_at(c("mpg", "hp"), funs(mean))
这应该可以解决问题。