Повторное секвенирование на основе значения столбцов

Я действительно новичок в 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 СТЕНДОВ.

Пока что я пробовал:

  myDF$SEQ <- seq(1:3)

Но это только списки 1: 3 на протяжении всего df.

Очень благодарен за вашу помощь!

1 ответ

Попробуй это:

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

Или короче, но с тем же результатом, если вы можете жить с предупреждающими сообщениями из-за повторного использования последовательностей 1:3 по длинам каждого STAND - длины, которые не обязательно кратны длине 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

ave разбивает x vector (здесь: STAND), на части, определяемые уровнями следующего (безымянного) аргумента (здесь: STAND). Функция по умолчанию FUN который применяется к каждой из частей в ave является mean, Здесь мы изменим эту функцию на "анонимную функцию", function(y), что мы определяем как rep(1:3, length.out = length(y)), "У" соответствует каждой из частей. Вы можете заменить "y" на любое имя по вашему выбору (например, function(chunk) rep(1:3, length.out = length(chunk)), Вы увидите, что довольно часто люди используют function(x), но я не хотел использовать "x" в качестве имени каждого фрагмента здесь, потому что "x" также используется в качестве аргумента в ave для всего вектора. За каждый кусок repзафиксируйте значения 1:3 до нужной длины (length.out), то есть длина каждого куска: length(y)

Другие вопросы по тегам