我正在尝试使用dplyr的新“across”函数将mutate_at()翻译为mutate(),但有点困惑。
简而言之,我需要比较一系列列中的值与“基准”列的值。当列中的值高于基准时,我需要使用基准值。当列中的值低于或等于基准时,我需要保留该值。以下是一个示例数据集(我的实际数据集要大得多):
test <- structure(list(baseline = c(5, 7, 8, 4, 9, 1, 0, 46, 47), bob = c(7,
11, 34, 9, 6, 8, 3, 49, 12), sally = c(3, 5, 2, 2, 6, 1, 3, 4,
56), rita = c(6, 4, 6, 7, 6, 0, 3, 11, 3)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L), spec = structure(list(
cols = list(baseline = structure(list(), class = c("collector_double",
"collector")), bob = structure(list(), class = c("collector_double",
"collector")), sally = structure(list(), class = c("collector_double",
"collector")), rita = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
我的当前代码使用mutate_at(),运行良好:
trial1 <- test %>%
mutate_at(
vars('bob','sally', 'rita'),
funs(case_when(
. > baseline ~ baseline,
. <= baseline ~ .)))
但是当我尝试使用dplyr 1.0的across()函数进行更新时,我一直收到一个错误。这是我的尝试:
但是当我尝试使用dplyr 1.0的across()函数进行更新时,我一直收到一个错误。这是我的尝试:
trial2 <- test %>%
mutate(across(c(bob, sally, rita),
case_when(. > baseline ~ baseline,
. <= baseline ~ .)))
这里是错误信息:
错误:
mutate()
的输入参数..1
存在问题。 x. > baseline ~ baseline
,. <= baseline ~ .
的长度必须为 36 或 1,而不是 9 和 4。 ℹ 输入参数..1
是across(...)
有任何想法我可能做错了什么吗?case_when()
能和 across
一起使用吗?
funs
而不是fns
?如果我使用funs
运行它,它不会出错但也不会有任何改变。而如果我使用fns
,就会出现across
错误,因为fns
必须是 NULL/函数/公式/列表等。 - dez93_2000