R中观测数据的年龄计算

R中观测数据的年龄计算,r,dataframe,R,Dataframe,我有非常简单的大观测数据,假设结构如下: > 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

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

> 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

任何建议都将不胜感激。

一个选项是按“ID”分组,并获得“yearobs”列的
min
max
之间的差异

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))
在base R中,您可以执行以下操作:

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

library(dplyr)df%group\u by(ID)%%>%mutate(age=max(yearobs)-min(yearobs))
谢谢!超级快,尽管我更喜欢R-base选项。事实上我投了更高的票!我的错我没有在我的帖子里说。再次感谢。@DSA我的观点是,我关注的是效率部分,而不是
base R
击败了我。我的函数应该是
function(x)diff(range(x))
!在我的操作系统中,“max-min”似乎更快!不过很酷。