使用基于特定因子的输入顺序的值添加列

时间:2013-03-08 18:31:43

标签: 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 
 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

1 个答案:

答案 0 :(得分: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

如果您按多列分组,例如&#34; Transect&#34;和&#34;指向&#34;,将ave语句更改为:

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

当然,还有其他方法,包括使用基础R和使用包。其中一些由@Arun在his answer here中进行了总结和基准测试。


更新以解决新的问题要求

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

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