假设我有data.frame
,我希望创建一个名为duration
的新列,它仅针对status = Active
的记录进行计算,使用2016-12-10
作为今天的日期,所以duration = today - start_date
。
这种条件计算的最佳方法是什么?
status <- c("Active", "Inactive", "Active")
date <- c("2016-10-25", "2015-05-11", "2015-3-18")
start_date <- as.Date(date, format = "%Y-%m-%d")
data.frame(status, start_date)
答案 0 :(得分:2)
我们可以使用data.table
。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)
),在&#39; i&#39;中创建逻辑索引。并指定(:=
)今天&#39;之间的差异。和&#39; start_date&#39;作为&#39;持续时间&#39;柱。这将是有效的,因为它分配到位
library(data.table)
setDT(df1)[status == "Active", duration := today - start_date]
df1
# status start_date duration
#1: Active 2016-10-25 46 days
#2: Inactive 2015-05-11 NA days
#3: Active 2015-03-18 633 days
或base R
选项
i1 <- df1$status == "Active"
df1[i1, "duration"] <- today - df1$start_date[i1]
,其中
today <- as.Date("2016-12-10")
答案 1 :(得分:0)
使用dplyr
,您可以尝试:
dft %>%
dplyr::mutate(duration = ifelse(status == "Active", (today - start_date), NA))
其中dft
是您的初始数据框。