【问题标题】:Not sure if the match function is used correctly or there is other mistakes in this function in r不确定匹配函数是否正确使用或r中此函数有其他错误
【发布时间】:2021-09-22 17:56:25
【问题描述】:

我正在尝试应用一个函数来计算一些变量。我的输出应该是这样的:

在 D 列中,红色是 C 列的计算方式。这就是我使用函数match 的原因。要减去的数字 (1000) 应该是 A 列中第一个 R 出现的数字。我之前从未使用过match,所以这里或我的函数中的其他任何地方可能有问题。

这就是我所做的:

library(dplyr)
p_hi <- 0.472              
rate_increase_hi <- 1.058*10^(-3)  

seed.mass.fraction.f<-function(stage, p_hi, rate_increase_hi, c_total_biomass, c_biomass_during_rep){

 seed.mass.fraction <- 0  
 if(stage == "V") {rate_increase_hi = 0}
  if(stage == "R") {rate_increase_hi = rate_increase_hi}
  
  if(stage == "V") {c_biomass_during_rep = 0}
  if(stage == "R") {c_biomass_during_rep = c_total_biomass - c_total_biomass(match("R", stage))}
  
  if(seed.mass.fraction < p_hi)  {seed.mass.fraction = rate_increase_hi * c_biomass_during_rep}
  if(seed.mass.fraction >= p_hi) {seed.mass.fraction = p_hi}
  
  return(seed.mass.fraction)
  
}

c_total_biomass <- seq(0, 1600, 100)
stage <- c(rep("V", 10), rep("R", 7))
data.smf<- data.frame(cbind(stage, c_total_biomass)) %>%
  mutate(c_total_biomass = as.numeric(c_total_biomass)) %>%
  rowwise() %>%
  mutate(smf = seed.mass.fraction.f(stage, p_hi, rate_increase_hi, c_total_biomass, c_biomass_during_rep)) %>%
  ungroup()

我收到此错误:

Error: Problem with `mutate()` column `smf`.
i `smf = seed.mass.fraction.f(...)`.
x could not find function "c_total_biomass"
i The error occurred in row 11.

【问题讨论】:

标签: r function


【解决方案1】:

问题是seed.mass.fraction 没有作为输入参数传递,它应该从原始数据中找到,但它无法找到。一种选择是使用cur_data_all() 来获取数据并对列进行子集化

 seed.mass.fraction.f<-function(stage, p_hi, rate_increase_hi, c_total_biomass, c_biomass_during_rep){

 dat <- cur_data_all()
 c_total_biomass <- dat[["c_total_biomass"]]
 stage <- dat[["stage"]]
  first_c_total_biomass <- dat[["first_c_total_biomass"]]
 
  seed.mass.fraction <- 0
  if(stage == "V") {rate_increase_hi = 0}
  if(stage == "R") {rate_increase_hi = rate_increase_hi}
  
  if(stage == "V") {c_biomass_during_rep = 0}
  if(stage == "R") {c_biomass_during_rep = c_total_biomass - first_c_total_biomass}
  
  if(seed.mass.fraction < p_hi)  {seed.mass.fraction = rate_increase_hi * c_biomass_during_rep}
  if(seed.mass.fraction >= p_hi) {seed.mass.fraction = p_hi}
  
  return(seed.mass.fraction)
  
}

-测试

data.frame(stage, c_total_biomass) %>% 
    mutate(first_c_total_biomass = c_total_biomass[stage == "R"][1]) %>%
    rowwise %>% 
    mutate(smf = seed.mass.fraction.f(stage, p_hi, rate_increase_hi,
     c_total_biomass, c_biomass_during_rep)) %>%
    ungroup

-输出

# A tibble: 17 x 3
   stage c_total_biomass   smf
   <chr>           <dbl> <dbl>
 1 V                   0 0    
 2 V                 100 0    
 3 V                 200 0    
 4 V                 300 0    
 5 V                 400 0    
 6 V                 500 0    
 7 V                 600 0    
 8 V                 700 0    
 9 V                 800 0    
10 V                 900 0    
11 R                1000 0    
12 R                1100 0.106
13 R                1200 0.212
14 R                1300 0.317
15 R                1400 0.423
16 R                1500 0.472
17 R                1600 0.472

【讨论】:

  • 非常感谢。它工作得很好。有没有办法让它在函数中以某种方式与这个 mutate(first_c_total_biomass = c_total_biomass[stage == "R"][1]) 一起工作?我真正需要的是完全独立于测试阶段的功能。
  • @GiuseppePetri 问题是你在rowwise 之后调用函数并且数据不是参数。因此,cur_data_all 获取的是行数据而不是整列。否则,您可能需要一个数据 argumnet 作为函数的输入,这样会更容易
  • 我使用了rowwise,因为我不知道如何更好地测试这个东西。我不想占用你更多的时间。我不确定如何在函数中输入数据参数。我会稍微探索一下,如果需要,我会发布另一个问题。感谢您的所有帮助。
  • @GiuseppePetri 在函数中添加一个参数作为输入是否有任何问题,即data,然后它变得更容易
  • @GiuseppePetri 所以,当您调用mutate 中的函数时,它将是` mutate(smf = seed.mass.fraction.f(., stage, p_hi, rate_increase_hi, c_total_biomass, c_biomass_during_rep) )` 即. 是数据
猜你喜欢
  • 1970-01-01
  • 2011-07-12
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 2021-05-08
  • 1970-01-01
  • 2022-12-31
相关资源
最近更新 更多