0

我对 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。

非常感谢您的帮助!

4

1 回答 1

1

尝试这个:

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

或者更短,但结果相同,如果由于沿每个 STAND 的长度回收 1:3 序列而可以忍受警告消息 - 长度不一定是 1:3 长度的倍数:

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)

于 2013-10-03T12:06:00.047 回答