0

私はRに本当に慣れていないので、意味がわからなかったらごめんなさい。

STAND と呼ばれるいくつかの異なる領域で収集されたデータを含む DF があります。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 スタンドに分割されています。

これまでのところ、私は試しました:

  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の各ピースに適用されるデフォルトの関数aveは ですmeanfunction(y)ここで、その関数をとして定義する「無名関数」 に変更しますrep(1:3, length.out = length(y))。「y」は各ピースに対応します。「y」は任意の名前に置き換えることができます (例:function(chunk) rep(1:3, length.out = length(chunk))を使用する人が非常に多いことがわかりますがfunction(x)、ここでは各ピースの名前として「x」を使用したくありません。ベクトル全体の引数ave. 各ピースについてrep、値を 1:3 で目的の長さ ( length.out)、つまり各ピースの長さに分割します。length(y)

于 2013-10-03T12:06:00.047 に答える