запустить скрипт в соответствии с логическими условиями в R - PullRequest
0 голосов
/ 24 июня 2018

В моем наборе данных я работаю с группами (стратами) SKU-acnumber-year. Вот маленький пример:

df=structure(list(SKU = c(11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L
), stuff = c(8.85947691, 9.450108704, 10.0407405, 10.0407405, 
10.63137229, 11.22200409, 11.22200409, 11.81263588, 12.40326767, 
12.40326767, 12.40326767, 12.99389947, 13.58453126, 14.17516306, 
14.76579485, 15.94705844, 17.12832203, 17.71895382, 21.26274458, 
25.98779894, 63.19760196), action = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), 
    acnumber = c(137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 
    137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 
    137L, 137L, 137L), year = c(2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L)), .Names = c("SKU", 
"stuff", "action", "acnumber", "year"), class = "data.frame", row.names = c(NA, 
-21L))

Очень важно:

Столбец действия имеет только два значения 0 и 1. Как мы можем видеть в этом примере, есть 3 наблюдения за вещами из 1 категории действий и 18 наблюдений за вещами из нулевой категории.

Мне нужно установить логическое условие. так, для групп, которые имеют от 1 до 4 наблюдений по элементам действия 1 категории, затем запустите script1.r

и для групп, которые имеют> = 5 наблюдений по материалам 1 категории действий, тогда необходимо запустить script2.r

Я мог бы представить это таким образом, скрипт script3.r создан, со следующим содержанием (условием), но я не знаю, как правильно установить эти логические условия.

# i take data from sql
dbHandle <- odbcDriverConnect("driver={SQL Server};server=;database=;trusted_connection=true")
sql <- paste0(select needed columns)
df <- sqlQuery(dbHandle, sql)



   for groups where from 1-4  observations by stuff of 1 category of action then  C:/path to/скрипт1.r
(or if  groups have from 1-4  observations by stuff of 1 category of action then  C:/path to/script1.r)
    for  groups   where >=5 observations by stuff of 1 category of action then C:/path to/script2.r
( of if groups  have >=5 observations by stuff of 1 category of action then C:/path to/script2.r)

Как мне это реализовать? script.3r запускается по расписанию, он будет работать по расписанию, чтобы запустить два сценария. Я просто не хочу составлять свой график для каждого сценария отдельно.

1 Ответ

0 голосов
/ 24 июня 2018

Рассмотрим if логику внутри by, метод для нарезки кадра данных по коэффициентам.И запустите другие сценарии через командную строку с system() вызовом Rscript (при условии, что в каталоге R bin установлена ​​переменная среды PATH):

by_list <- by(df, df[,c("SKU", "acnumber", "year")], function(sub) {

  if (sum(sub$action == 1) %in% c(1:4))   system("Rscript /path/to/script1.r")
  if (sum(sub$action == 1) >= 5)          system("Rscript /path/to/script2.r")

  return(sub)
})

Еще лучше, source() внешние сценарии вОсновной сценарий, обеспечивающий завершение всего процесса обоих сценариев в вызовах function(), даже добавляя аргументы, например, конкретный SKU.В противном случае source будет запускать эти файлы.При таком подходе вы можете вернуть результат.

source("/path/to/script1.r")   # IMPORTS script1_function()
source("/path/to/script2.r")   # IMPORTS script2_function()

by_list <- by(df, df[,c("SKU", "acnumber", "year")], function(sub) {

  current_SKU <- max(sub$SKU)   # OR min(sub$SKU) OR sub$SKU[[1]]

  if (sum(sub$action == 1) %in% c(1:4))  output <- script1_function()
  if (sum(sub$action == 1) >= 5)         output <- script2_function()

  return(output)
})
...