1

我有一个这样的数据框:

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(vesselID, by=list(FisherID,Year,Month ), length)

但我得到的是:

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

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

4

1 回答 1

3

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

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

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

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
于 2012-11-17T14:44:58.603 回答