创建具有逻辑比较的函数作为输入 R
Creating functions with logical comparatives as input R
为了检查一致性,我对 R 中的两个变量进行了多次顺序比较评估。
在这个例子中,假设我有一个布尔值 ANES_6 和一个数字 ANES。如果患者麻醉时间超过 6 小时,则布尔值为 1,否则为 0。数值是患者处于麻醉状态的时间。
我正在寻找一个可以替换以下多个复制粘贴的函数:
data %>% select(ANES_6, ANES) %>%
filter(ANES_6 == 1 & ANES < 6)) %>%
tally()
data %>% select(ANES_6, ANES) %>%
filter(ANES_6 == 0 & ANES >= 6)) %>%
tally()
data %>% select(ANES_6, ANES) %>%
filter(ANES_6 == 1 & ANES >= 6)) %>%
tally()
data %>% select(ANES_6, ANES) %>%
filter(ANES_6 == 0 & ANES >= 6)) %>%
tally()
我可以创建以下函数(上面显示的所有情况并非详尽无遗):
my_func <- function(x, y) {
if (x == "gt" & y == 1) {
data %>% select(ANES_6, AnaestheticTime_hours_) %>%
filter(ANES >= 6 & ANES_6 == 1) %>%
tally()
} else if (x == "lt" & y == 0 ) {
data %>% select(ANES_6, AnaestheticTime_hours_) %>%
filter(ANES < 6 & ANES_6 != 1) %>%
tally()
}}
以 x 和 y 作为输入,x 的值为 c('lt', 'gt'),y 为 c(0, 1),以评估所有可能的条件.但是,这将需要编写更多而不是更少的代码。
有没有一种方法可以在函数中输入逻辑比较,从而实现以下工作:
my_func <- function(x, y) {
data %>% select(ANES_6, ANES) %>%
filter(ANES x 6 & ANES_6 == y)
}
with x
replaced by >=
, <
, etc, in the function.目前,这不起作用,是否有任何解决方法?
尝试分组。问题通常应该包括可重现的测试数据,但我这次提供了它。
library(dplyr)
data <- data.frame(ANES_6 = c(0, 0, 1, 1), ANES = 5:6) # test data
data %>%
group_by(ANES_6, ANES >= 6) %>%
tally %>%
ungroup
给予:
# A tibble: 4 x 3
ANES_6 `ANES >= 6` n
<dbl> <lgl> <int>
1 0. FALSE 1
2 0. TRUE 1
3 1. FALSE 1
4 1. TRUE 1
为了检查一致性,我对 R 中的两个变量进行了多次顺序比较评估。
在这个例子中,假设我有一个布尔值 ANES_6 和一个数字 ANES。如果患者麻醉时间超过 6 小时,则布尔值为 1,否则为 0。数值是患者处于麻醉状态的时间。
我正在寻找一个可以替换以下多个复制粘贴的函数:
data %>% select(ANES_6, ANES) %>%
filter(ANES_6 == 1 & ANES < 6)) %>%
tally()
data %>% select(ANES_6, ANES) %>%
filter(ANES_6 == 0 & ANES >= 6)) %>%
tally()
data %>% select(ANES_6, ANES) %>%
filter(ANES_6 == 1 & ANES >= 6)) %>%
tally()
data %>% select(ANES_6, ANES) %>%
filter(ANES_6 == 0 & ANES >= 6)) %>%
tally()
我可以创建以下函数(上面显示的所有情况并非详尽无遗):
my_func <- function(x, y) {
if (x == "gt" & y == 1) {
data %>% select(ANES_6, AnaestheticTime_hours_) %>%
filter(ANES >= 6 & ANES_6 == 1) %>%
tally()
} else if (x == "lt" & y == 0 ) {
data %>% select(ANES_6, AnaestheticTime_hours_) %>%
filter(ANES < 6 & ANES_6 != 1) %>%
tally()
}}
以 x 和 y 作为输入,x 的值为 c('lt', 'gt'),y 为 c(0, 1),以评估所有可能的条件.但是,这将需要编写更多而不是更少的代码。
有没有一种方法可以在函数中输入逻辑比较,从而实现以下工作:
my_func <- function(x, y) {
data %>% select(ANES_6, ANES) %>%
filter(ANES x 6 & ANES_6 == y)
}
with x
replaced by >=
, <
, etc, in the function.目前,这不起作用,是否有任何解决方法?
尝试分组。问题通常应该包括可重现的测试数据,但我这次提供了它。
library(dplyr)
data <- data.frame(ANES_6 = c(0, 0, 1, 1), ANES = 5:6) # test data
data %>%
group_by(ANES_6, ANES >= 6) %>%
tally %>%
ungroup
给予:
# A tibble: 4 x 3
ANES_6 `ANES >= 6` n
<dbl> <lgl> <int>
1 0. FALSE 1
2 0. TRUE 1
3 1. FALSE 1
4 1. TRUE 1