我有一个这样的数据框:
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()计算那些不同的船只。我尝试了不同的聚合方式而没有成功。任何帮助将深表感谢。干杯,拉斐尔
答案 0 :(得分:3)
首先提出一个问题:您的预期输出似乎并不反映您的要求。您询问ID每年更改的次数,但您的预期输出似乎表明您想知道每年会观察到多少个唯一VesselID
。例如,在2000年,ID改变一次,而在2001年,ID改变两次。在这两年中,都观察到两个唯一的ID。
所以要获得你发布的结果,
如果您要按FisherID
和Year
查找统计信息,那么也没有理由按Month
查看。相反,您应该查看FisherID
和Year
的每个组合的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