在 tibble 上应用函数时出现屏蔽问题

问题描述 投票:0回答:1

我有一个简单的函数,它接受两个关键参数并从 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()
解决问题,但没有成功...非常感谢任何帮助!

提前致谢, 乔纳斯

r function dplyr filter masking
1个回答
1
投票

首先,我认为您在其中一个数据框中交换了列。我正在纠正

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))
© www.soinside.com 2019 - 2024. All rights reserved.