使用循环根据R中的日期顺序分配类别

时间:2017-02-14 03:34:29

标签: r for-loop

我有一个有趣的,我认为应该是一个简单的问题。问题是如何根据另一列中的数字或日期顺序分配分类变量。

数据是一段时间内的样本点数据。在若干年的过程中,已经多次测量了相同的点。我想为每个采样点分配值T1,T2,T3等,T1为第一次测量,T2为第二次测量,依此类推每个点。

如果数据是例如:

df <- data.frame(Point = factor(c("A", "A", "B", "B", "C", "D", "E", "E", "E")), 
                            Date = c("20140404", "20161002", "20150217", "20170101", "20130508",
                                     "20130514", "20131024", "20150412", "20170210"),
                            Data = c(10, 5, 5, 3, 2, 7, 8, 5, 6))

数据框看起来像:

   Point     Date Data
1      A 20140404   10
2      A 20161002    5
3      B 20150217    5
4      B 20170101    3
5      C 20130508    2
6      D 20130514    7
7      E 20131024    8
8      E 20150412    5
9      E 20170210    6

最终结果将是:

  Point     Date Data  Time
1      A 20140404   10  T1
2      A 20161002    5  T2
3      B 20150217    5  T1
4      B 20170101    3  T2
5      C 20130508    2  T1
6      D 20130514    7  T1
7      E 20131024    8  T2
8      E 20150412    5  T3
9      E 20170210    6  T1

我确信这可以使用for循环完成,其中:

for (i in df$Point {
df$Time <- 
}

但我不知道如何让R为最低df $ Date添加T1,为下一个添加T2等等。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

你可以这样做:

df$Time <- paste0("T", ave(df$Data, df$Point, FUN=seq_along))

输出:

print(df)

  Point     Date Data Time 
1     A 20140404   10   T1
2     A 20161002    5   T2
3     B 20150217    5   T1
4     B 20170101    3   T2
5     C 20130508    2   T1
6     D 20130514    7   T1
7     E 20131024    8   T1
8     E 20150412    5   T2
9     E 20170210    6   T3

假设您对Date列进行了排序(就像您在示例中所示的那样)。

ave函数在因子的级别组合上对FUN(在这种情况下为seq_along)进行分组。 seq_along生成常规序列。

有关详细信息,请参阅R帮助文档页面:

  • ?ave
  • ?seq_along