有没有更有效的方法来计算 R 中的月份差异
Is there a more efficient way to calculate the difference in months in R
我有一个面板结构的大数据框(201720 行;3 列),如下所示:
Name <- c("A", "A", "A", "B", "B", "B")
Inception <- c(as.Date("2007-12-31"), as.Date("2007-12-31"), as.Date("2007-12-31"),
as.Date("1990-12-31"), as.Date("1990-12-31"), as.Date("1990-12-31"))
Months <- c(as.Date("2010-01-01"), as.Date("2010-02-01"), as.Date("2010-03-01"),
as.Date("2010-01-01"), as.Date("2010-02-01"), as.Date("2010-03-01"))
df <- data.frame(Name, Inception, Months)
我想计算每一行的 «Inception» 和 «Months» 的月数差异,并将其分配给名为 «Age» 的新列。如果结果为负,则应填写 NA。我想出了以下解决方案并且有效。但是,它的计算速度不是很快。
for (i in 1:nrow(df)){
if(df[i,2]>df[i,3]){
df[i,"Age"] <- NA
} else {
df[i,"Age"] <- interval(df[i,2],
df[i,3]) %/% months(1)
}
}
有没有更有效的方法来计算这个差异?
我们可以使用case_when
library(dplyr)
library(lubridate)
df <- df %>%
mutate(Age = case_when(Inception <= Months
~ interval(Inception, Months) %/% months(1)))
-输出
df
Name Inception Months Age
1 A 2007-12-31 2010-01-01 24
2 A 2007-12-31 2010-02-01 25
3 A 2007-12-31 2010-03-01 26
4 B 1990-12-31 2010-01-01 228
5 B 1990-12-31 2010-02-01 229
6 B 1990-12-31 2010-03-01 230
我有一个面板结构的大数据框(201720 行;3 列),如下所示:
Name <- c("A", "A", "A", "B", "B", "B")
Inception <- c(as.Date("2007-12-31"), as.Date("2007-12-31"), as.Date("2007-12-31"),
as.Date("1990-12-31"), as.Date("1990-12-31"), as.Date("1990-12-31"))
Months <- c(as.Date("2010-01-01"), as.Date("2010-02-01"), as.Date("2010-03-01"),
as.Date("2010-01-01"), as.Date("2010-02-01"), as.Date("2010-03-01"))
df <- data.frame(Name, Inception, Months)
我想计算每一行的 «Inception» 和 «Months» 的月数差异,并将其分配给名为 «Age» 的新列。如果结果为负,则应填写 NA。我想出了以下解决方案并且有效。但是,它的计算速度不是很快。
for (i in 1:nrow(df)){
if(df[i,2]>df[i,3]){
df[i,"Age"] <- NA
} else {
df[i,"Age"] <- interval(df[i,2],
df[i,3]) %/% months(1)
}
}
有没有更有效的方法来计算这个差异?
我们可以使用case_when
library(dplyr)
library(lubridate)
df <- df %>%
mutate(Age = case_when(Inception <= Months
~ interval(Inception, Months) %/% months(1)))
-输出
df
Name Inception Months Age
1 A 2007-12-31 2010-01-01 24
2 A 2007-12-31 2010-02-01 25
3 A 2007-12-31 2010-03-01 26
4 B 1990-12-31 2010-01-01 228
5 B 1990-12-31 2010-02-01 229
6 B 1990-12-31 2010-03-01 230