在同一个月和不同月份计算不同的ID

时间:2012-11-17 14:24:27

标签: r

我有一个这样的数据框:

FisherID    Year    Month   VesselID
1   2000    1   56
1   2000    1   81
1   2000    2   81
1   2000    3   81
1   2000    4   81
1   2000    5   81
1   2000    6   81
1   2000    7   81
1   2000    8   81
1   2000    9   81
1   2000    10  81
1   2001    1   56
1   2001    2   56
1   2001    3   81
1   2001    4   56
1   2001    5   56
1   2001    6   56
1   2001    7   56
1   2002    3   81
1   2002    4   81
1   2002    5   81
1   2002    6   81
1   2002    7   81

...我需要每年ID更改的时间,所以我想要的输出是:

    FisherID    Year    DiffVesselUsed
1   2000    1
1   2001    2
1   2002    0

我尝试使用aggregate():

aggregate(vesselID, by=list(FisherID,Year,Month ), length)

但我得到的是:

FisherID    Year    DiffVesselUsed
1   2000    2
1   2001    1
1   2002    1

因为当那些仅在同一个月出现的那些时,aggregate()计算那些不同的船只。我尝试了不同的聚合方式而没有成功。任何帮助将深表感谢。干杯,拉斐尔

1 个答案:

答案 0 :(得分:3)

首先提出一个问题:您的预期输出似乎并不反映您的要求。您询问ID每年更改的次数,但您的预期输出似乎表明您想知道每年会观察到多少个唯一VesselID。例如,在2000年,ID改变一次,而在2001年,ID改变两次。在这两年中,都观察到两个唯一的ID。

所以要获得你发布的结果,

如果您要按FisherIDYear查找统计信息,那么也没有理由按Month查看。相反,您应该查看FisherIDYear的每个组合的VesselID的唯一值。

aggregate(VesselID, by = list(FisherID, Year), function(x) length(unique(x)))
#   Group.1 Group.2 x
# 1       1    2000 2
# 2       1    2001 2
# 3       1    2002 1

如果您真的想要更改ID的次数,请使用rle功能。

aggregate(VesselID, by = list(FisherID, Year),
  function(x) length(rle(x)$values) - 1)
#   Group.1 Group.2 x
# 1       1    2000 1
# 2       1    2001 2
# 3       1    2002 0