我想將整數的資料框列添加到同一行中日期的資料框列,將結果放入新列中。然后計算從開始到同一行中的事件的天數,將它們放入新列中。資料框中有很多日期列和超過 5 行,所以回圈或類似的東西可能會很好。
這就是我所擁有的:
havedf <- data.frame(id = c("100","103","104","107","109"),
startDate = c("2015-04-02","2017-01-10","2016-02-11","2012-01-16","2014-03-05"),
eventOneDate = c("2015-04-10","2017-03-13","2016-03-04","2012-03-06","2014-03-11"),
eventTwoDate = c("2015-05-02","2017-08-12","2016-05-09","2012-04-05","2014-06-09"),
extradays = c(12,9,16,5,10))
這就是我要的:
wantdf <- data.frame(id = c("100","103","104","107","109"),
startDate = c("2015-04-02","2017-01-10","2016-02-11","2012-01-16","2014-03-05"),
eventOneDate = c("2015-04-10","2017-03-13","2016-03-04","2012-03-06","2014-03-11"),
eventTwoDate = c("2015-05-02","2017-08-12","2016-05-09","2012-04-05","2014-06-09"),
extradays = c(12,9,16,5,10),
startDate_w_extra = c("2015-04-14","2017-01-19","2016-02-27","2012-01-21","2014-03-15"),
eventOneDate_w_extra = c("2015-04-22","2017-03-22","2016-03-20","2012-03-11","2014-03-21"),
eventTwoDate_w_extra = c("2015-05-14","2017-08-21","2016-05-25","2012-04-10","2014-06-19"),
daysToEventOne = c(8,62,22,50,6),
daysToEventTwo = c(30,214,88,80,96))
uj5u.com熱心網友回復:
我們可以這樣做:
- 將所有日期轉換為日期格式。在這里,我們使用包中的
ymd()函式來完成lubridate。
然后你可以做簡單的數學:
library(lubridate)
library(dplyr)
havedf %>%
mutate(across(contains("Date"), ymd)) %>%
mutate(startDate_w_extra = startDate extradays,
eventOneDate_w_extra = eventOneDate extradays,
eventTwoDate_w_extra = eventTwoDate extradays,
daysToEventOne = as.integer(eventOneDate - startDate),
daysToEventTwo = as.integer(eventTwoDate - startDate)
)
id startDate eventOneDate eventTwoDate extradays startDate_w_extra eventOneDate_w_extra eventTwoDate_w_extra daysToEventOne daysToEventTwo
1 100 2015-04-02 2015-04-10 2015-05-02 12 2015-04-14 2015-04-22 2015-05-14 8 30
2 103 2017-01-10 2017-03-13 2017-08-12 9 2017-01-19 2017-03-22 2017-08-21 62 214
3 104 2016-02-11 2016-03-04 2016-05-09 16 2016-02-27 2016-03-20 2016-05-25 22 88
4 107 2012-01-16 2012-03-06 2012-04-05 5 2012-01-21 2012-03-11 2012-04-10 50 80
5 109 2014-03-05 2014-03-11 2014-06-09 10 2014-03-15 2014-03-21 2014-06-19 6 96
uj5u.com熱心網友回復:
使用dplyr,您可以across()用來簡化重復的列操作。
library(dplyr)
havedf %>%
mutate(across(contains("Date"), as.Date),
across(contains("Date"), ` `, extradays, .names = "{.col}_w_extra"),
across(matches("^event. Date$"), `-`, startDate, .names = "daysTo{.col}"))
# # A tibble: 5 × 10
# id startDate eventOneDate eventTwoDate extradays startDate_w_extra eventOneDate_w_extra eventTwoDate_w_extra daysToeventOneDate daysToeventTwoDate
# <chr> <date> <date> <date> <dbl> <date> <date> <date> <drtn> <drtn>
# 1 100 2015-04-02 2015-04-10 2015-05-02 12 2015-04-14 2015-04-22 2015-05-14 8 days 30 days
# 2 103 2017-01-10 2017-03-13 2017-08-12 9 2017-01-19 2017-03-22 2017-08-21 62 days 214 days
# 3 104 2016-02-11 2016-03-04 2016-05-09 16 2016-02-27 2016-03-20 2016-05-25 22 days 88 days
# 4 107 2012-01-16 2012-03-06 2012-04-05 5 2012-01-21 2012-03-11 2012-04-10 50 days 80 days
# 5 109 2014-03-05 2014-03-11 2014-06-09 10 2014-03-15 2014-03-21 2014-06-19 6 days 96 days
uj5u.com熱心網友回復:
@TarJae答案的簡化版本:
library(lubridate)
library(dplyr)
havedf %>%
mutate(across(contains("Date"), ymd)) %>%
mutate(across(contains("Date"), .fns = list(w_extra = ~ . extradays)),
daysToEventOne = as.integer(eventOneDate - startDate),
daysToEventTwo = as.integer(eventTwoDate - startDate))
id startDate eventOneDate eventTwoDate extradays startDate_w_extra eventOneDate_w_extra eventTwoDate_w_extra
1 100 2015-04-02 2015-04-10 2015-05-02 12 2015-04-14 2015-04-22 2015-05-14
2 103 2017-01-10 2017-03-13 2017-08-12 9 2017-01-19 2017-03-22 2017-08-21
3 104 2016-02-11 2016-03-04 2016-05-09 16 2016-02-27 2016-03-20 2016-05-25
4 107 2012-01-16 2012-03-06 2012-04-05 5 2012-01-21 2012-03-11 2012-04-10
5 109 2014-03-05 2014-03-11 2014-06-09 10 2014-03-15 2014-03-21 2014-06-19
daysToEventOne daysToEventTwo
1 8 30
2 62 214
3 22 88
4 50 80
5 6 96
如果您有兩個以上的事件并且不想選擇事件日期列,則可以使用:
havedf %>%
mutate(across(contains("Date"), ymd)) %>%
mutate(across(contains("Date"), .fns = list(w_extra = ~ . extradays)),
across(contains("event") & !contains("w_extra"), .fns = list(daysTo = ~ .- startDate)))
輸出:
id startDate eventOneDate eventTwoDate extradays startDate_w_extra eventOneDate_w_extra eventTwoDate_w_extra
1 100 2015-04-02 2015-04-10 2015-05-02 12 2015-04-14 2015-04-22 2015-05-14
2 103 2017-01-10 2017-03-13 2017-08-12 9 2017-01-19 2017-03-22 2017-08-21
3 104 2016-02-11 2016-03-04 2016-05-09 16 2016-02-27 2016-03-20 2016-05-25
4 107 2012-01-16 2012-03-06 2012-04-05 5 2012-01-21 2012-03-11 2012-04-10
5 109 2014-03-05 2014-03-11 2014-06-09 10 2014-03-15 2014-03-21 2014-06-19
eventOneDate_daysTo eventTwoDate_daysTo
1 8 days 30 days
2 62 days 214 days
3 22 days 88 days
4 50 days 80 days
5 6 days 96 days
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/481362.html
上一篇:如何獲取日期的新列計數出現次數
