【问题标题】:Different age calculation for different rows不同行的不同年龄计算
【发布时间】:2017-05-23 15:16:54
【问题描述】:

我是一个绝对的 R 初学者,正在从事硕士项目。

我有一个 data.frame,其中包含有关小跑马的信息(他们的胜利、收入、时间记录等)。数据的组织方式是,每一行都包含马匹竞争的特定年份的信息,并包括每匹马“总计”的第一行,因此每个变量都有一个关于它的总竞争寿命的摘要。它看起来像这样:

我使用 eeptools 包中的 age_calc 函数创建了一个包含他们年龄的新变量:

travdata$Age<-age_calc(as.Date(travdata$Birth.date), enddate=as.Date("2016-12-31"),
                       units="years")

没有问题。我想弄清楚的是,是否有任何方法可以计算我掌握的每个特定年份的马的年龄-也就是说,“总”行的年龄将持续到 2016 年 12 月- 31,对于 2015 年,它将有他们当时的年龄,依此类推。我一直在尝试在 age_calc 中包含 if 语句,但它不起作用,我真的不知道如何最好地做到这一点。

您可以指出我的任何文献或帮助将非常非常感谢。

MWE

travdata <- data.frame(
    "Id.Number"=c(rep("1938-98",3),rep("1803-97",7),rep("1221-03",4)),
    "Name"=c(rep("Muuttuva",3),rep("Pelson Poika",7),rep("Muusan Muisto",4)),
    "Sex"=c(rep("Mare",3),rep("Gelding",7),rep("Gelding",4)),
    "Birth.year"=c(rep(1998,3),rep(1997,7),rep(2003,4)),
    "Birth.date"=c(rep("1998-07-01",3),rep("1997-07-14",7),rep("2003-05-07",4)),
    "Competition.year" = c("Total",2005,2004,"Total",2003,2004,2006,2005,2002,2001,2008,2010,"Total",2009),
    "starts"=c(20,11,9,44,21,6,7,5,3,2,1,1,4,2),
    "X1st.placements"=c(0,0,0,3,3,0,0,0,0,0,0,0,0,0),
    "X2nd.placements"=c(2,2,0,1,0,1,0,0,0,0,0,0,0,0),
    "X3rd.placements"=c(2,2,0,1,1,0,0,0,0,0,0,0,0,0),
    "Earnings.euro"=c(1525,1425,100,2078,1498,580,0,0,0,0,0,0,10,10)
)

【问题讨论】:

  • 欢迎来到 StackOverflow。请查看有关如何生成minimum, complete, and verifiable example 的这些提示,以及creating a great example in R 上的这篇文章。
  • 我会保持这些数据整洁并删除总计行,您可以稍后使用 dplyr::group_by 轻松获取总计,或者您可以将这些行移动到新表中。如果您需要这方面的帮助,请使用dput(head(travdata, 10)) 并将结果粘贴到您的问题中。这将为某人创建一个最低限度的示例。

标签: r


【解决方案1】:

诀窍是过滤掉“Total”行并为as.Date() 函数指定格式

library(eeptools)
travdata <- data.frame(
    "Id.Number"=c(rep("1938-98",3),rep("1803-97",7),rep("1221-03",4)),
    "Name"=c(rep("Muuttuva",3),rep("Pelson Poika",7),rep("Muusan Muisto",4)),
    "Sex"=c(rep("Mare",3),rep("Gelding",7),rep("Gelding",4)),
    "Birth.year"=c(rep(1998,3),rep(1997,7),rep(2003,4)),
    "Birth.date"=c(rep("1998-07-01",3),rep("1997-07-14",7),rep("2003-05-07",4)),
    "Competition.year" = c("Total",2005,2004,"Total",2003,2004,2006,2005,2002,2001,2008,2010,"Total",2009),
    "starts"=c(20,11,9,44,21,6,7,5,3,2,1,1,4,2),
    "X1st.placements"=c(0,0,0,3,3,0,0,0,0,0,0,0,0,0),
    "X2nd.placements"=c(2,2,0,1,0,1,0,0,0,0,0,0,0,0),
    "X3rd.placements"=c(2,2,0,1,1,0,0,0,0,0,0,0,0,0),
    "Earnings.euro"=c(1525,1425,100,2078,1498,580,0,0,0,0,0,0,10,10)
)

travdata$Age<-age_calc(as.Date(travdata$Birth.date), 
                       enddate=as.Date("2016-12-31"), units="years")

competitions <- travdata[travdata$Competition.year!="Total",]
competitions$Competition.age<-age_calc(
                 as.Date(competitions$Birth.date),
                 enddate=as.Date(competitions$Competition.year, format="%Y"), 
                 units="years",F)

【讨论】:

  • 是的,它做到了!谢谢谢谢!!我认为对代码的格式调整是我所缺少的。我会记住它的未来:)
  • 嘿@rgunning!再次感谢您上次的帮助。我要查看这段代码,因为我想将我所做的另一个年龄变量Real.age 转换为几个月,现在不仅你的这个旧代码不起作用,什么都不起作用! (我保存了如何生成当前数据集的脚本)。这就是我为 Real.age 变量所做的:Data_year$Real.age&lt;-age_calc(as.Date(Data_year$Birth.date), enddate=as.Date(Data_year$Competition.year, format="%Y"), units="years", F)。我尝试将最后一个 eyars 更改为几个月,它只是说必须提供原产地。即使是你的代码!帮忙?
  • @LauraBas 奇怪的是它不适合你。将units="years" 交换为units="months" 应该可以。查看as.Date(Data_year$Birth.date)as.Date(Data_year$Competition.year, format="%Y") 以确保所有值都有日期。 age_calc 函数不能很好地处理 NaN 值。
  • 嘿@rgunning。我检查了所有,没有 NaN 或 Nas。我尝试过使用这行代码,要么得到必须提供原点的错误,要么得到:Error in if (any(enddate &lt; dob)) { : missing value where TRUE/FALSE needed。我真的不知道该怎么办。我尝试回到我询问时使用的原始 data.frame,但它也不起作用。我已经通过眼睛查看了数据,并且在其中找不到任何奇怪的东西。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2016-01-28
  • 2020-12-28
  • 2016-03-20
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多