基于列值重复排序

时间:2013-10-02 15:12:16

标签: r indexing sequencing

我真的很新R,所以我很抱歉,如果我没有完全理解。

我有一个DF,在几个不同的区域收集数据,称为STAND。我需要为从1:3运行的数据创建一个序列,但是当涉及新的STAND编号时必须重新启动序列。

这是一些虚拟数据

    STAND   TREE_SPECIES    DIAMETER
1   101737  Pine             276
2   101737  Spruce           98
3   101737  Spruce       104
4   101737  Leaf         53
5   155897  Spruce       82
6   155897  Spruce       61
7   155897  Leaf         97
8   155897  Spruce       89
9   155897  Spruce       75
10  202568  Spruce       46
11  202568  Spruce       56
12  202568  Pine         204
13  202568  Spruce       132
14  202568  Spruce       93 

我希望它看起来像这样:

    STAND   TREE_SPECIES    DIAMETER     SEQ
1   101737  Pine             276          1
2   101737  Spruce           98           2
3   101737  Spruce       104          3
4   101737  Leaf         53           1
5   155897  Spruce       82           1
6   155897  Spruce       61           2
7   155897  Leaf         97           3
8   155897  Spruce       89           1
9   155897  Spruce       75           2
10  202568  Spruce       46           1
11  202568  Spruce       56           2
12  202568  Pine         204          3
13  202568  Spruce       132          1
14  202568  Spruce       93           2

如果有任何帮助,我的DF总共有7416行,分为90个STANDS。

到目前为止,我已经尝试过:

  myDF$SEQ <- seq(1:3)

但是在整个df中仅列出1:3。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

试试这个:

df$SEQ <- ave(x = df$STAND, df$STAND, FUN = function(y) rep(1:3, length.out = length(y)))

或更短,但结果相同,如果您可以使用警告信息,因为沿着每个STAND的长度循环1:3序列 - 长度不一定是1:3长度的倍数:< / p>

df$SEQ2 <- ave(df$STAND, df$STAND, FUN = function(y) 1:3)

结果:

df
#     STAND TREE_SPECIES DIAMETER SEQ SEQ2
# 1  101737         Pine      276   1    1
# 2  101737       Spruce       98   2    2
# 3  101737       Spruce      104   3    3
# 4  101737         Leaf       53   1    1
# 5  155897       Spruce       82   1    1
# 6  155897       Spruce       61   2    2
# 7  155897         Leaf       97   3    3
# 8  155897       Spruce       89   1    1
# 9  155897       Spruce       75   2    2
# 10 202568       Spruce       46   1    1
# 11 202568       Spruce       56   2    2
# 12 202568         Pine      204   3    3
# 13 202568       Spruce      132   1    1
# 14 202568       Spruce       93   2    2

avex向量(此处为:STAND)拆分为由下一个(未命名)参数(此处为STAND)的级别定义的片段。应用于FUN中每个部分的默认函数avemean。在这里,我们将该函数更改为“匿名函数”function(y),我们将其定义为rep(1:3, length.out = length(y))。 'y'对应于每个部分。您可以使用任何选择的名称替换“y”(例如function(chunk) rep(1:3, length.out = length(chunk))。您会看到人们经常使用function(x),但我不想使用'x'作为每个部分的名称这里因为'x'也被用作整个向量的ave中的参数。对于每一个,rep将值1:3转换为所需的长度(length.out),即每件作品的长度:length(y)