set.seed(3)
library(dplyr)
x <- tibble(Measure = c("Height","Weight","Width","Length"),
AD1_1= rpois(4,10),
AD1_2= rpois(4,9),
AD2_1= rpois(4,10),
AD2_2= rpois(4,9),
AD3_1= rpois(4,10),
AD3_2= rpois(4,9))
假设我有看起来像这样的数据。我希望为每个 AD 运行一个函数,并与下划线数字配对,即 AD1fun、AD2fun、AD3fun。
而不是写作,
fun <- function(x,y){x-y}
dat %>%
mutate(AD1fun = fun(AD1_1,AD1_2),
AD2fun = fun(AD2_1,AD2_2),
...)
x_minus <- x %>%
mutate(fun(across(ends_with("_1"), .names = "{col}_minus"), across(ends_with("_2")))) %>%
rename_with(~ sub("_\\d+", "", .), ends_with("_minus"))
可用于生产
# A tibble: 4 x 10
Measure AD1_1 AD1_2 AD2_1 AD2_2 AD3_1 AD3_2 AD1_minus AD2_minus AD3_minus
<chr> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 Height 6 10 10 3 12 8 -4 7 4
2 Weight 8 9 13 6 14 7 -1 7 7
3 Width 10 9 11 5 12 8 1 6 4
4 Length 8 9 8 7 8 13 -1 1 -5
但是,如果我们要使非操作功能,
fun <- function(x,y){
case <- case_when(
x == y ~ "Agree",
x == 0 & y != 0 ~ "Disagreement",
x != 0 & y == 0 ~ "Disagreement",
x-y <= 1 & x-y >= -1 ~ "Agree",
TRUE ~ "Disagree"
)
return(case)
}
x_case <- x %>%
mutate(fun(across(ends_with("_1"), .names = "{col}_case"), across(ends_with("_2")))) %>%
rename_with(~ sub("_\\d+", "", .), ends_with("_case"))
它将产生一个错误,因为引用,
此过程实质上意味着您比较两个数据集:一个带有以 _1 结尾的变量,另一个带有 _2。因此,它与 dat %>% select(ends_with("_1")) - dat %>% select(ends_with("_2")) 相同。由于这些是列表,因此您无法以这种方式比较它们
如果是这样,可以做些什么来包含使用cross() 的函数?