r - 分组执行 ifelse 的更好方法

标签 r if-statement group-by data.table

我的数据集包含 ID、体重、日期、状态和基线列,如下所示

  Id     Weight     Date         Status     Baseline
  5      121.23     04/16/1995   No         NA
  5      134.12     12/17/2008   No         NA
  5      167.63     03/15/2002   No         NA
  5      139.22     08/15/2001   No         NA
  23     232.19     11/10/2009   Yes        11/06/2001
  23     274.13     10/03/2004   Yes        11/06/2001
  23     134.23     07/11/2006   Yes        11/06/2001

如果状态为“否”,那么我希望新列 Recent_Weight 存储最接近该 ID 的 SysDate () 的权重。如果状态为"is",那么我希望 Recent_Weight 是最接近基线列中日期的权重。

  Id     Weight     Date         Status     Baseline      Recent_Weight
  5      121.23     04/16/1995   No         NA            134.12 
  5      134.12     12/17/2008   No         NA            134.12  
  5      167.63     03/15/2002   No         NA            134.12
  5      139.22     08/15/2001   No         NA            134.12
  23     232.19     11/10/2009   Yes        11/06/2001    274.13    
  23     274.13     10/03/2004   Yes        11/06/2001    274.13
  23     134.23     07/11/2006   Yes        11/06/2001    274.13

现在我正在使用 mutate 和 group_by 执行此操作,如下所示

library(dplyr)
Test2 %>% 
  group_by(Id) %>% 
  mutate(New_Weight = ifelse(Status== "No",   
  as.numeric(Weight[which.min(abs(Sys.Date() - Date))]), 
  as.numeric(Weight[which.min(abs(Baseline   - Date))])))

但是我得到的结果非常不一致。我每次都必须关闭并重新启动,否则我会得到错误的答案(我知道这很奇怪)。我想知道是否有人可以建议我一种更好的方法来获得相同的结果。谢谢大家。非常感谢您的宝贵时间。

最佳答案

您可以尝试data.table方式:

library(data.table)
library(dplyr)

data <- fread(
"Id     Weight     Date         Status     Baseline
5      121.23     04/16/1995   No         NA
5      134.12     12/17/2008   No         NA
5      167.63     03/15/2002   No         NA
5      139.22     08/15/2001   No         NA
23     232.19     11/10/2009   Yes        11/06/2001
23     274.13     10/03/2004   Yes        11/06/2001
23     134.23     07/11/2006   Yes        11/06/2001"
) %>% mutate(
  Status   = Status=='Yes',
  Date     = as.Date(Date, format="%m/%d/%Y"),
  Baseline = as.Date(Baseline, format="%m/%d/%Y")
)

data[, Recent_Weight := ifelse(Status,
  Weight[which.min(abs(Date-Baseline))],
  Weight[which.max(Date)] # no need to compare to Sys.Date()
                          # if you do not have dates in the future
), by=Id]

关于r - 分组执行 ifelse 的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837017/

相关文章:

sql - 位域上 MAX 运算符的替代方法

Mysql select distinct only if certain time difference exist

r - 如何计算 R 中的频率(计数)变量?

r - 创建xts对象会导致时间戳更改

sql - 计算oracle中两个日期之间每小时的记录数

R cumsum 与 if 条件

python - 有人可以向我解释一下下面代码中的命令 [0][1][2] 以及它们是如何工作的

r - 找出R中一个月中的天数

r - 将面板数据拆分为组

python - 将 24 小时添加到 python 中的负时差