- 此问题在此处已有答案**:
Number of months between two dates(11个答案)
2天前关闭。
我有一列参与者的出生日期,我需要以 * 月*为单位来测量他们的年龄。我想知道是否有一种自动的方法来解释事实,如月份有不同的天数,年份也有不同的天数(等等)?我的意思是:我知道我可以设置一个随机的30或31为月或365或366为年,但我想知道是否有办法让R得到实际的日期,就像Sys.Date()
那样,这样我就可以更精确地知道。这是我在其他问题中没有看到的[编辑]
- 数据:
head(data)
ID BIRTH YEAR
1 A 23/04/2009 2009
2 B 24/03/2010 2010
3 C 28/12/2009 2009
- 我需要获得参与者从特定日期起的月龄。例如,从他们出生到2020年8月31日(注:日期的巴西表示法是日/月/年)。
我看过很多有趣的帖子,比如this one,但是他们没有解决我需要的,所以我希望这不是重复的。我也看过一些建议,比如difftime("23/04/2009", "31/08/2020", units = 'weeks')
,但是它几个月都不起作用。
- 数据:
> dput(data)
structure(list(ID = c("A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U"
), BIRTH = c("23/04/2009", "24/03/2010", "28/12/2009", "19/08/2009",
"02/12/2009", "12/05/2010", "26/02/2010", "07/10/2009", "22/04/2010",
"01/04/2010", "31/03/2010", "27/01/2010", "23/09/2009", "28/09/2009",
"28/10/2009", "21/06/2009", "28/10/2009", "19/08/2009", "10/09/2009",
"13/07/2009", "22/09/2009"), YEAR = c("2009", "2010", "2009",
"2009", "2009", "2010", "2010", "2009", "2010", "2010", "2010",
"2010", "2009", "2009", "2009", "2009", "2009", "2009", "2009",
"2009", "2009")), row.names = c(NA, -21L), class = "data.frame")
3条答案
按热度按时间i2byvkas1#
首先确保你的两个日期都是日期格式(一个选择是使用
lubridate
的dmy
函数)。有了日期格式,我们可以做数学运算,意思是从一个日期减去另一个日期。诀窍是把整个事情围绕as.numeric
来得到numeric类。顺便说一下,从天得到月,我们必须除以365/12:ovfsdjhp2#
使用answer here中的函数,您可以继续以月份为单位计算年龄差,如Dif_months1中所示。要获得更准确的结果,您可以使用
lubridate
中的interval
,请参阅Dif_months2:请注意,我将原始日期的格式设置为
format="%d/%m/%Y"
输出:
kninwzqo3#
如您所述,
difftime()
不适用于“month”,因为不可能给予“明确”的答案:可以除以30或31,或者使用考虑闰年或不考虑闰年的一年中的天数,等等。否则,您的问题是一个双行程序。假设您的数据位于data中。frame
D
:其中我们首先解析为
Date
,然后使用difftime
,并将(任意选择的)一个月缩放30天。当然,你也可以替换
BIRTH
,或者只使用向量。我喜欢把数据放在一起。如果你愿意,你可以把引用数据作为帮助函数的函数参数。两行程序不需要其他包,而且,如果你愿意,一行程序也可以在引用日期仍然是输入数据之外使用的一个参数的情况下工作:
(我打破了两行显示,但实际上只有一行)。