R和Excel中的周数输出不同

inn6fuwd  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(168)

工作日在R和Excel中的输出是不同的。有什么方法可以使两者的输出相同吗?如果可能的话,R的输出应该与Excel电子表格相匹配。下面是代码和数据供参考:

structure(list(Pred_date = structure(c(7L, 8L, 10L, 2L, 9L, 14L, 
6L, 12L, 5L, 15L, 13L, 3L, 1L, 12L, 12L, 3L, 12L, 12L, 4L, 7L, 
9L, 11L, 11L), .Label = c("5/28/2020", "5/30/2020", "6/1/2020", 
"6/12/2020", "6/13/2020", "6/20/2020", "6/22/2020", "6/23/2020", 
"6/24/2020", "6/25/2020", "6/4/2020", "6/6/2020", "7/11/2020", 
"7/18/2020", "7/4/2020"), class = "factor")), class = "data.frame", row.names = c(NA, 
-23L))
library(lubridate)
date$Pred_date<-mdy(date$Pred_date)
date$Week_Act_Pay<-lubridate::week(ymd(date$Pred_date))
head(date)

这是R中的输出:

以下是excel中的输出:

bd1hkmkf

bd1hkmkf1#

Excel的WEEKNUM函数的起始日为“Sunday”,1月1日是一年中的第一周。您可以在format中使用"%U"并向其添加1来重现相同的输出。

date$Week_Act_Pay <- as.integer(format(date$Pred_date, "%U")) + 1
v64noz0r

v64noz0r2#

文档显示这两个函数(R的week和Excel的WEEKNUM)计算的是不同的东西。

Rlubridate::week计算从给定日期到1月1日之间的7天时段数加1 *。
*电子表格WEEKNUM:计算
周数
*,使包含1月1日的周为一年的第一周,并假定该周从星期日开始。这也称为“epi week”(流行病学的缩写)或“CDC week”。Here is the reference

在R中,你可以通过简单地使用lubridate::epiweek()来获得epi周。
此示例说明如何为日期January 13,2020计算每个值

因此,在您的数据中,您可以使用以下公式获得R中的Excel结果:

date$Week_Act_Pay<-lubridate::week(ymd(date$Pred_date))
head(date)

打印此内容:

Pred_date Week_Act_Pay
1 2020-06-22           26
2 2020-06-23           26
3 2020-06-25           26
4 2020-05-30           22
5 2020-06-24           26
6 2020-07-18           29
a9wyjsp7

a9wyjsp73#

处理2023年这样的数据需要对Ronak非常有用的建议进行修改。
在2023年这样的星期日开始的年份中,您不希望将1加到返回的周中,因为在这种情况下,该年的第一周将被编码为1,而不是像其他年份那样编码为0。在这样的年份中,如果将1加到返回的周中,则每周都将减去1。
下面是一个似乎与Excel的WEEKNUM很匹配的函数:

weekNumExcel <- function(dateVar = NULL) {
  sundayStartYears <- c(1956, 1961, 1967, 1978, 1984, 1989, 1995, 
                        2006, 2012, 2017, 2023, 2034, 2040)
  ifelse(format(dateVar, "%Y") %in% sundayStartYears,
         as.integer(format(dateVar, "%U")),
         as.integer(format(dateVar, "%U")) + 1)
}

相关问题