Автоматизируйте определяемую пользователем функцию для обработки кадров данных

#r

Вопрос:

Я хотел бы создать код, который берет различное количество X1, X2, X3...XN кадров данных, содержащих четыре столбца данных time, height, start, group , и автоматически запускает их с помощью определяемой пользователем функции HL_plot Vulntookit . Я предполагаю, что мог бы использовать цикл for, но я все еще очень новичок в R и немного застрял на этом шаге. Если я использую функцию вручную, код выглядит следующим образом:

 HL.plot (level = X1[, 2], time = X1[, 1], period = 0.3, 
         phantom = TRUE, tides = "H")
HL.plot (level = X2[, 2], time = X2[, 1], period = 0.3, 
         phantom = TRUE, tides = "H")
HL.plot (level = X3[, 2], time = X3[, 1], period = 0.3, 
         phantom = TRUE, tides = "H")
HL.plot (level = XN[, 2], time = XN[, 1], period = 0.3, 
         phantom = TRUE, tides = "H")
 

Функция строит второй height и первый time столбцы данных.

Комментарии:

1. как насчет использования Xnew <- rbind(X1, X2, X3,.. XN) ? это гарантирует, что все кадры данных будут объединены в один по строкам, так что вы можете использовать функцию прямо в Xnew

2. Я не уверен, что понимаю. Я все еще борюсь с конкретным кодом, используемым для назначения Xnew неизвестному или изменяющемуся количеству кадров данных X1, X2, X3, X4......

3. какую борьбу вы испытываете? есть ли какие-либо ошибки при его выполнении? попробуйте просто ввести в него доступный фрейм данных..

Ответ №1:

Предполагая, что если у вас много фреймов данных, которые называются следующим образом X1, X2, X3,..X100,..XN , лучший способ, который я могу придумать, чтобы автоматически объединить их (вместо того, чтобы вводить 1 на 1 фрейм данных в rbind() параметр, — это создать выражение оценки по строке:

 eval_expression = "Xnew <- rbind("
#example if n is 200 (200 dataframes available)
n <- 200
for(a in 1:n){
  if(a == n){
    eval_expression <- paste0(eval_expression, "X",a,")")
  }
  else{
    eval_expression <- paste0(eval_expression, "X",a,",")
  }
}
 

вы также можете попробовать посмотреть, что находится внутри eval_expression после выполнения вышеуказанных кодов, а затем, наконец, выполнить окончательное выполнение:

 eval(parse(text = eval_expression))