如何在 R 中使用 apply family 制作一个简单的脚本
How to make a simple script using apply family in R
我需要使用 R 进行异常检测,但我认为我的代码很长。我需要得到 "Find Anomaly" 和 "Total Anomaly"。有人可以使用 apply family 让它变得简单吗?这里的代码
#Library
library(AnomalyDetection)
# Data Preparation
set.seed(1)
datex <- seq(as.Date("2017/01/01"), as.Date("2019/01/01"), by = "day")
x1 <- rf(731,3,4); x2 <- rf(731,3,4); x3 <- rf(731,3,4)
data.train <- data.frame(datex,x1,x2,x3,x4,x5)
# Find Anomaly x1
find.anomaly.x1 <- AnomalyDetectionTs(data.train[,c(1,2)],
max_anoms = 0.3,
direction = "both",
alpha = 0.05,
plot = F); find.anomaly.x1$anoms
# Find Anomaly x2
find.anomaly.x2 <- AnomalyDetectionTs(data.train[,c(1,3)],
max_anoms = 0.3,
direction = "both",
alpha = 0.05,
plot = F);find.anomaly.x2$anoms
# Find Anomaly x3
find.anomaly.x3 <- AnomalyDetectionTs(data.train[,c(1,4)],
max_anoms = 0.3,
direction = "both",
alpha = 0.05,
plot = F); find.anomaly.x3$anoms
# List Find Anomaly
find.anomaly
## Total Anomaly
# Total Anomaly x1
total.anomaly.x1 <- dim(find.anomaly.x1$anoms)[1]; total.anomaly.x1
# Total Anomaly x2
total.anomaly.x2 <- dim(find.anomaly.x2$anoms)[1]; total.anomaly.x2
# Total Anomaly x3
total.anomaly.x3 <- dim(find.anomaly.x3$anoms)[1]; total.anomaly.x3
# Total Anomaly
var.anom <- c("x1","x2","x3")
tot.anom.x <- c(total.anomaly.x1,total.anomaly.x2,total.anomaly.x3)
total.anomaly <- data.frame(var.anom,tot.anom.x)
total.anomaly
带有 purrr 包的解决方案:
library(purrr)
anomaly <- function(data, col) {
x <- AnomalyDetectionTs(data[,c(1, col)],
max_anoms = 0.3,
direction = "both",
alpha = 0.05,
plot = F)
x$anoms
}
find.anomaly <- map(2:4, ~ anomaly(data.train, col = .))
total.anomaly <- map(find.anomaly, ~ dim(.)[1])
和使用 lapply
的基础 R 解决方案
find.anomaly <- lapply(2:4, function(x) anomaly(data.train, col = x))
total.anomaly <- lapply(find.anomaly, function(x) dim(x)[1])
回复:评论,让 total.anomaly 像 df 那样:
find.anomaly <- map(2:6, ~ anomaly(data.train, col = .)) %>% setNames(names(data.train)[2:6])
total.anomaly <- map_df(find.anomaly, ~ dim(.)[1])
我需要使用 R 进行异常检测,但我认为我的代码很长。我需要得到 "Find Anomaly" 和 "Total Anomaly"。有人可以使用 apply family 让它变得简单吗?这里的代码
#Library
library(AnomalyDetection)
# Data Preparation
set.seed(1)
datex <- seq(as.Date("2017/01/01"), as.Date("2019/01/01"), by = "day")
x1 <- rf(731,3,4); x2 <- rf(731,3,4); x3 <- rf(731,3,4)
data.train <- data.frame(datex,x1,x2,x3,x4,x5)
# Find Anomaly x1
find.anomaly.x1 <- AnomalyDetectionTs(data.train[,c(1,2)],
max_anoms = 0.3,
direction = "both",
alpha = 0.05,
plot = F); find.anomaly.x1$anoms
# Find Anomaly x2
find.anomaly.x2 <- AnomalyDetectionTs(data.train[,c(1,3)],
max_anoms = 0.3,
direction = "both",
alpha = 0.05,
plot = F);find.anomaly.x2$anoms
# Find Anomaly x3
find.anomaly.x3 <- AnomalyDetectionTs(data.train[,c(1,4)],
max_anoms = 0.3,
direction = "both",
alpha = 0.05,
plot = F); find.anomaly.x3$anoms
# List Find Anomaly
find.anomaly
## Total Anomaly
# Total Anomaly x1
total.anomaly.x1 <- dim(find.anomaly.x1$anoms)[1]; total.anomaly.x1
# Total Anomaly x2
total.anomaly.x2 <- dim(find.anomaly.x2$anoms)[1]; total.anomaly.x2
# Total Anomaly x3
total.anomaly.x3 <- dim(find.anomaly.x3$anoms)[1]; total.anomaly.x3
# Total Anomaly
var.anom <- c("x1","x2","x3")
tot.anom.x <- c(total.anomaly.x1,total.anomaly.x2,total.anomaly.x3)
total.anomaly <- data.frame(var.anom,tot.anom.x)
total.anomaly
带有 purrr 包的解决方案:
library(purrr)
anomaly <- function(data, col) {
x <- AnomalyDetectionTs(data[,c(1, col)],
max_anoms = 0.3,
direction = "both",
alpha = 0.05,
plot = F)
x$anoms
}
find.anomaly <- map(2:4, ~ anomaly(data.train, col = .))
total.anomaly <- map(find.anomaly, ~ dim(.)[1])
和使用 lapply
的基础 R 解决方案find.anomaly <- lapply(2:4, function(x) anomaly(data.train, col = x))
total.anomaly <- lapply(find.anomaly, function(x) dim(x)[1])
回复:评论,让 total.anomaly 像 df 那样:
find.anomaly <- map(2:6, ~ anomaly(data.train, col = .)) %>% setNames(names(data.train)[2:6])
total.anomaly <- map_df(find.anomaly, ~ dim(.)[1])