【问题标题】:How to mutate a new col in dataframe using a specific function and conditions? Tidyverse/R如何使用特定的函数和条件来改变数据框中的新 col? Tidyverse/R
【发布时间】:2023-03-06 11:53:02
【问题描述】:

首先,我找不到与我的问题相关的问题,如果这个问题已经得到回答,我们深表歉意。

我有一个包含一些列的数据框,我想使用特定的计算来计算一个新值。我想我必须使用来自 tidyverse 的mutate(),但我想避免存在一个或多个 0 值的行/样本。当我使用mutate() 时,我不知道如何检查是否有任何 0。另外,我不知道如何应用我的特定公式来创建新列。

我在这里留下一个代码来创建一个数据框作为我的问题的一个例子。

set.seed(123)
df <- data.frame(
  time = seq(now(), now()+hours(11),by='hours'),
  a = sample(0:100,12),
  b = sample(0:100,12),
  c = sample((0:20)/1000,12))

df[1:3,]$a <- 0
df[3:5,]$b <- 0
df[3:4,]$c <- 0

# function: M = a*b+(1-e^(-c/2))
# if any 0 in the row -> M = NA
# else: apply function

函数可以写成

a*b*(1-exp(-c/2))

最终的 df 每小时(行)应该有 4 列(a、b、c 和新计算的 M),但是当 a | b | c == 0, M = NA 时。

我会非常感谢每一个小小的帮助。干杯!

编辑:实际函数比这个例子更复杂,所以如果一个项 (a,b,c,...) 为 0,则结​​果 M 为 0 并不总是正确的。抱歉,我没有'没有意识到这个假设对于简化方程是正确的。 但我想避免任何 0 值,因为它们来自监测生理变量,我知道如果样本中有一个值为 0,那么样本是错误的,所以不适用。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    如果 abc 中的任何一个为 0,则将 M 返回为 0,可以将其更改为 NA

    library(dplyr)
    
    df %>%
      mutate(M = a*b*(1-exp(-c/2)), 
             M = na_if(M, 0))
    
    #                  time  a  b     c         M
    #1  2021-10-18 19:41:56  0 90 0.013        NA
    #2  2021-10-18 20:41:56  0 56 0.016        NA
    #3  2021-10-18 21:41:56  0  0 0.000        NA
    #4  2021-10-18 22:41:56 13  0 0.000        NA
    #5  2021-10-18 23:41:56 66  0 0.011        NA
    #6  2021-10-19 00:41:56 41 71 0.014 20.305847
    #7  2021-10-19 01:41:56 49 25 0.009  5.500115
    #8  2021-10-19 02:41:56 42  6 0.012  1.507473
    #9  2021-10-19 03:41:56 97 41 0.017 33.661237
    #10 2021-10-19 04:41:56 24 97 0.008  9.293401
    #11 2021-10-19 05:41:56 89 82 0.019 69.002718
    #12 2021-10-19 06:41:56 68 35 0.015 17.783230
    

    【讨论】:

    • 哦,对不起,也许这不是最好的例子,我试图简化数据集和方程。方程被简化。例如,在原来的一项中是一个附加项,所以如果一项为0,则M将为0是不正确的。我将在此处发布原始方程:ab*(c+d(1- exp(-e/(fg)))) 我使用字母是为了更容易理解。很抱歉对于这个误会。你知道这是否是一种使用我最初问的条件的方法,而不使用你发布的这个“数学”技巧吗?
    • 如果有办法使用类似 'M = na_if(M, 0)' 部分的东西,但是,不是 M,而是在 a,b,c,... 中寻找 0,它就足够了,但我不知道这样的功能。泰
    • 最后,我使用了你的方法,但反过来。首先,我将所有 0 替换为 NA 值,因此等式将返回 NA。我会勾选您的回复作为解决方案。不过,我仍然希望知道是否有办法在条件下做到这一点。
    • @RobertoT df %&gt;% mutate(M = ifelse(if_any(a:c, ~. == 0), NA, a*b*(1-exp(-c/2)))) 怎么样?
    • 非常感谢!我不知道 if_any。这是一个很好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2021-05-07
    • 2021-12-02
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多