【问题标题】:Age calculation for observation data in R [duplicate]R中观察数据的年龄计算[重复]
【发布时间】:2023-03-11 02:05:01
【问题描述】:

我有非常简单的大观察数据,假设结构如下:

> df = data.frame(ID = c("oak", "birch", rep("oak",2), "pine", "birch", "oak", rep("pine",2), "birch", "oak"),
+                 yearobs = c(rep(1998,3), rep(1999,2), rep(2000,3),rep(2001,2), 2002))
> df
      ID yearobs
1    oak    1998
2  birch    1998
3    oak    1998
4    oak    1999
5   pine    1999
6  birch    2000
7    oak    2000
8   pine    2000
9   pine    2001
10 birch    2001
11   oak    2002

我想要做的是通过计算每个唯一 ID(本例中的树种)的年份差 (max(yearobs)-min(yearobs)) 来计算年龄。我尝试使用 lubridate + dplyr 包,但是,每个唯一 ID 的观察次数在我的数据中有所不同,我想以最快的方式创建一个年龄列,而不单独存储最小值和最大值(避免在这里循环,因为我的数据很大)。

期望的输出:

     ID age
1   oak   4
2 birch   3
3  pine   3

任何建议都将不胜感激。

【问题讨论】:

  • library(dplyr) df <- df %>% group_by(ID) %>% mutate(age = max(yearobs)-min(yearobs))

标签: r dataframe


【解决方案1】:

在基础 R 中你可以这样做:

aggregate(yearobs ~ ID, data = df, FUN = function(x) max(x) - min(x))
#      ID yearobs
# 1 birch       3
# 2   oak       4
# 3  pine       2

【讨论】:

  • 打败我。我的函数应该是function(x) diff(range(x))
  • 如此明显,但我一直在努力解决循环问题!在我的操作系统中,“max-min”似乎更快!不过很酷。
【解决方案2】:

一个选项是按“ID”分组并获取“yearobs”列的minmax 之间的差异

library(dplyr)
df %>% 
   group_by(ID) %>% 
   summarise(age = max(yearobs) - min(yearobs))

此外,如果我们需要快速完成此操作,那么data.table 将是另一种选择

library(data.table)
setDT(df)[, .(age = max(yearobs) - min(yearobs)), by = ID]

或使用base R

by(df['yearobs'], df$ID, FUN = function(x) max(x)- min(x))

【讨论】:

  • 谢谢!超级快,尽管我更喜欢 R-base 选项。
  • 我真的投了赞成票!我的错,我没有在我的帖子中说明这一点。再次感谢。
  • @DSA 我的意思是我关注的是效率部分而不是base R
猜你喜欢
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多