0

我想向数据框中添加一列,其中列中的值基于另一列中特定因子的输入顺序。因此,特别是对于我的数据,我希望第一次访问某个点时使用“1”,第二次访问时使用“2”,第三次访问时使用“3”等。但是,有些点对于给定的访问有重复访问日期并且应该共享相同的访问号码。

数据框是预先排序的,看起来像这样:

  Transect Point    Date 
 1      BEN     1  5/7/12 
 2      BEN     1 5/10/12 
 3      BEN     1 5/10/12 
 4      BEN     2  5/8/12 
 5      BEN     2 5/11/12
 6      BEN     2 5/13/12

我想得到这样的东西:

 Transect Point    Date  Vist
1      BEN     1  5/7/12     1
2      BEN     1 5/10/12     2
3      BEN     1 5/10/12     2
4      BEN     2  5/8/12     1  
5      BEN     2 5/11/12     2
6      BEN     2 5/13/12     3
4

1 回答 1

3

假设您的 data.frame 称为 SODF,请使用ave

within(SODF, {
  Visit <- ave(Point, Point, FUN = seq_along)
})
#   Transect Point    Date Visit
# 1      BEN     1  5/7/12     1
# 2      BEN     1 5/10/12     2
# 3      BEN     1 5/13/12     3
# 4      BEN     2  5/8/12     1
# 5      BEN     2 5/11/12     2

如果您按多列分组,例如“横断面”和“点”,请将ave语句更改为:

ave(Point, Transect, Point, FUN = seq_along)

当然,还有其他方法,使用基本 R 和使用包。@Arun 在此处的回答中对其中一些进行了总结和基准测试。


更新以解决新的问题要求

考虑到您的新要求,想到的一个快速解决方案是首先提取唯一案例,执行上述索引生成,然后将结果表与原始表合并。

SODFunique <- SODF[!duplicated(SODF), ]
SODFunique <- within(SODFunique, {
  Visit <- ave(Point, Transect, Point, FUN = seq_along)
})
merge(SODF, SODFunique, sort = FALSE)
#   Transect Point    Date Visit
# 1      BEN     1  5/7/12     1
# 2      BEN     1 5/10/12     2
# 3      BEN     1 5/10/12     2
# 4      BEN     2  5/8/12     1
# 5      BEN     2 5/11/12     2
# 6      BEN     2 5/13/12     3
于 2013-03-08T18:35:43.777 回答