我有一个简单的函数,它接受两个关键参数并从 tibble 返回相应的值。当我传递单个值作为参数时,该函数工作得很好。但当应用于 tibble 时,就会出现错误
wsa_m2 must be size 3 or 1, not 0
。
require("tidyverse")
wsa <- tibble("trim" = c(4, 4, 4, 5, 5, 5, 6, 6, 6),
"draught" = c(7, 8, 9, 7, 8, 9, 7, 8, 9),
"wsa" = c(100, 200, 300, 400, 500, 600, 700, 800, 900))
data <- tibble("draught_m" = c(6, 5, 4), "trim_m" = c(9, 8, 7))
get_wsa <- function(draught_m, trim_m, wsa_tab) {
filter(wsa_tab, draught == draught_m &
trim == trim_m)$wsa
}
# works perfectly fine
a <- get_wsa(draught_m = 7, trim_m = 5, wsa_tab = wsa)
# error
data2 <- mutate(data, wsa_m2 = get_wsa(draught_m = data$draught_m,
trim_m = data$trim_m,
wsa_tab = wsa))
回溯表明这似乎是一个屏蔽问题。我已经尝试使用
enquo()
解决问题,但没有成功...非常感谢任何帮助!
提前致谢, 乔纳斯
首先,我认为您在其中一个数据框中交换了列。我正在纠正
data
数据框。
data <- tibble("trim_m" = c(6, 5, 4), "draught_m" = c(9, 8, 7))
但即使在那之后它也不会给出正确的答案,因为当你“手动”运行示例时,你只传递了一个值,但
data$draught_m
和 data$trim_m
有 3 个值。因此,您需要将 rowwise
添加到代码中,以便它单独针对每一行执行。
data2 <- data %>%
rowwise() %>%
mutate(wsa_m2 = get_wsa(draught_m = draught_m, trim_m, wsa_tab = wsa))
data2
# A tibble: 3 × 3
# Rowwise:
# trim_m draught_m wsa_m2
# <dbl> <dbl> <dbl>
#1 6 9 900
#2 5 8 500
#3 4 7 100
但是,对于较大的数据库来说,这可能效率低下,您应该尝试使用联接。
data %>%
left_join(wsa, join_by(trim_m == trim, draught_m == draught))