运行 R中根据逻辑条件的脚本
run the script according to logical conditions in R
在我的数据集中,我使用组(层)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))
非常重要:
action 列只有两个值 0 和 1。正如我们在这个例子中看到的,有 3 个 1 类别动作的观测值和 18 个 0 类别的观测值。
我需要设置逻辑条件。
因此,对于按 1 类行为进行 1 到 4 次观察的组,则 运行 script1.r
并且对于 1 类行为的观察值 >=5 的组,则必须 运行 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 运行s by schedule,它会按照时间表工作,为了运行两个脚本。
我只是不想分别为每个脚本制作我的日程表。
考虑 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
将 运行 那些文件。通过这种方式,可以return输出
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)
})
在我的数据集中,我使用组(层)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))
非常重要:
action 列只有两个值 0 和 1。正如我们在这个例子中看到的,有 3 个 1 类别动作的观测值和 18 个 0 类别的观测值。
我需要设置逻辑条件。 因此,对于按 1 类行为进行 1 到 4 次观察的组,则 运行 script1.r
并且对于 1 类行为的观察值 >=5 的组,则必须 运行 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 运行s by schedule,它会按照时间表工作,为了运行两个脚本。 我只是不想分别为每个脚本制作我的日程表。
考虑 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
将 运行 那些文件。通过这种方式,可以return输出
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)
})