R 根据特定因子的输入顺序添加值的列

R 根据特定因子的输入顺序添加值的列,r,conditional-statements,R,Conditional Statements,我想在数据框中添加一列,其中列中的值基于另一列中特定因子的输入顺序。因此,特别是对于我的数据,我希望第一次访问某个点时有一个“1”,第二次访问时有一个“2”,第三次访问时有一个“3”,等等。但是,一些点在给定日期内有重复访问,并且应该共享相同的访问编号 数据帧是预排序的,如下所示: Transect Point Date 1 BEN 1 5/7/12 2 BEN 1 5/10/12 3 BEN 1 5/10/12

我想在数据框中添加一列,其中列中的值基于另一列中特定因子的输入顺序。因此,特别是对于我的数据,我希望第一次访问某个点时有一个“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
我想得到这样的东西:

  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

假设您的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

当然,还有其他方法,既使用baser,也使用包。其中一些由@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

SODFunique假设您的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

当然,还有其他方法,既使用baser,也使用包。其中一些由@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

SODFunique与。我得说这是一个复制品。与……关系非常密切。我会说这是一个副本。我只是注意到这是一个副本,指的是在评论下的那篇文章,它工作得很好,但我现在意识到另一个问题,我没有在我的第一篇文章中提到。在某一特定日期,我确实有几次重复访问。有没有想过编辑前面提到的代码来解决这个问题?@user2149445,我不知道。你希望如何解决这个问题。如果每个日期可能有多个访问,那么本例中的“访问”列数据都将是1,而不是您所描述的序列。@AnandaMahto您说得很对。输出不是真实的序列,但每个点内的每个日期都有一个唯一的访问编号。@AnandaMahto感谢您的欢迎。我编辑了原始问题和示例数据框,以更好地解决我实际遇到的问题。最初的回答回答了我一半的问题。我缺少了处理重复行的那一半(如在新的示例数据框中)。我已经阅读了链接页面,但仍然没有完成我的问题。我只是注意到这是一个重复,引用了评论下的那篇文章,效果很好,但是我现在意识到我在第一篇文章中没有提到的另一个问题。在某一特定日期,我确实有几次重复访问。有没有想过编辑前面提到的代码来解决这个问题?@user2149445,我不知道。你希望如何解决这个问题。如果每个日期可能有多个访问,那么本例中的“访问”列数据都将是1,而不是您所描述的序列。@AnandaMahto您说得很对。输出不是真实的序列,但每个点内的每个日期都有一个唯一的访问编号。@AnandaMahto感谢您的欢迎。我编辑了原始问题和示例数据框,以更好地解决我实际遇到的问题。最初的回答回答了我一半的问题。我缺少了处理重复行的那一半(如在新的示例数据框中)。我已经阅读了链接页面,但在完成我的问题时仍然有不足之处。