У меня есть конкретный вопрос программирования относительно R.
Я хочу применить пользовательскую функцию ко всему набору данных, но значения в функции должны измениться по сравнению с той группой, к которой она принадлежит. Вот набор данных, который похож на тот, с которым я работаю
set.seed(123)
df <- data.frame(group = c(rep("one", 10), rep("two", 9), rep("three", 11)),
slot = c(1:10, 1:9, 1:11),
x = sample(100, 30))
И функция
RI_fun <- function(x, y) {
((x - y)/ y) * 100
}
Реальный набор данных больше, но структура такая же. Небольшая информация о реальном наборе данных: это серия измерений (слотов) в выборке (группе), где я хочу, чтобы первое измерение (слот == 1) было y в пользовательской функции (RI_fun)
Я хочу создать новый столбец, который является выводом пользовательской функции, где x = df $ x, а y - значение x, где df $ slot == 1 для каждой группы.
Я пытался создать цикл for, но безуспешно. Моя идея состояла в том, чтобы сделать значение y оператором if else, где он проверял df $ group и применял df $ x, где slot == 1 и group == group, которые только что были проверены.
Вот моя попытка:
for (i in seq_along(df$group)) {
RI[i] = RI_fun(x = df$x[i],
y = (ifelse(df$group == df$group[i],
df$x[df$slot == 1 & df$group == df$group[i]],
NA)))
Однако вывод:
[1] 0.00000 172.41379 41.37931 196.55172 213.79310 -82.75862 72.41379 186.20690 75.86207 44.82759 NA
[12] NA NA NA NA NA NA NA NA NA NA NA
[23] NA NA NA NA NA NA NA NA
Когда я вручную проверил, каким должен быть вывод, он показал, что цикл for работает правильно до [11], где он больше не работает. Я пробовал некоторые другие циклы for, похожие на этот, но это тот, где я был ближе всего к желаемому результату.
Буду признателен за любую помощь, которую вы получите. Если я не достаточно ясно, пожалуйста, спросите, и я постараюсь сделать это более ясно.