Повторное секвенирование на основе значения столбцов
Я действительно новичок в 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)