我有一个如下所示的数据集:
data <- structure(list(Date = structure(c(-2208988800, -2208902400, -2208816000,
-2208729600, -2208643200, -2208556800, -2208470400, -2208384000,
-2208297600, -2208211200, -2208124800, -2208038400, -2207952000
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), count = c(4668.8,
4476.9, 4945, 5275.7, 15013.1, 14418, 14059.1, 14043.5, 14142.2,
14904.2, 13849.9, 14712.1, 8793.9)), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -13L))
日期 | 数 |
---|---|
1900年1月1日 | 4,668.80 |
1900年2月1日 | 4,476.90 |
1900年3月1日 | 4,945.00 |
1900年4月1日 | 5,275.70 |
1900年5月1日 | 15,013.10 |
1900年6月1日 | 14,418.00 |
1900年1月7日 | 14,059.10 |
1900年8月1日 | 14,043.50 |
1900年9月1日 | 14,142.20 |
1900年1月10日 | 14,904.20 |
1900年1月11日 | 13,849.90 |
1900年1月12日 | 14,712.10 |
1900年1月13日 | 8,793.90 |
我正在尝试编写一个函数,根据前一个单元格是否为异常值来添加列。我希望有一个如下所示的数据集:
日期 | 数 | 异常值_T1 | 异常值_T2 | 异常值_T3 | 异常值_T4 | 异常值_T5 | 异常值_T6 | 异常值_T7 | 异常值_T8 | 异常值_T9 | 异常值_T10 | 异常值_T11 | 异常值_T12 | 异常值_T13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1900年1月1日 | 4,668.80 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1900年2月1日 | 4,476.90 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1900年3月1日 | 4,945.00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1900年4月1日 | 5,275.70 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1900年5月1日 | 15,013.10 | 1 | ||||||||||||
1900年6月1日 | 14,418.00 | 1 | ||||||||||||
1900年1月7日 | 14,059.10 | 1 | ||||||||||||
1900年8月1日 | 14,043.50 | 1 | ||||||||||||
1900年9月1日 | 14,142.20 | 1 | ||||||||||||
1900年1月10日 | 14,904.20 | 1 | ||||||||||||
1900年1月11日 | 13,849.90 | 1 | ||||||||||||
1900年1月12日 | 14,712.10 | 1 | ||||||||||||
1900年1月13日 | 8,793.90 | 1 |
直到第四行,没有任何异常值。但是,第五行是异常值,因此 outlier_t5 = 1。现在,outlier_t5 等于 1,因此可以免除分析,因此 outlier_t5 = NA,但 outlier_t6 = 1(因为前四行和第六行是下一个异常值计算)...等等。
我真的很感谢这里的一些帮助。
对于每个数据点,我们将添加一列来指示与之前的数据相比它是否为异常值。
这是一种可能的方法:
NA
。让我们从用 R 编写函数开始。
library(dplyr)
# Function to identify outliers
detect_outliers <- function(data, column_name) {
# Calculate IQR
Q1 <- quantile(data[[column_name]], 0.25)
Q3 <- quantile(data[[column_name]], 0.75)
IQR <- Q3 - Q1
# Limits to determine outliers
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
# Identify outliers
outlier_flags <- ifelse(data[[column_name]] < lower_bound | data[[column_name]] > upper_bound, 1, 0)
return(outlier_flags)
}
# Function to add outlier columns
add_outlier_columns <- function(data, column_name) {
n <- nrow(data)
# Create outlier columns
for (i in 1:n) {
data[[paste0("Outlier_T", i)]] <- NA
}
# Detect outliers and fill the columns
for (i in 5:n) { # Start from 5 as the example seems to consider the first 4 as non-outliers by default
# Use a subset of data up to the current index for detection
subset_data <- data[1:i, ]
outlier_flags <- detect_outliers(subset_data, column_name)
# Mark the last point as an outlier if it is one
data[i, paste0("Outlier_T", i)] <- outlier_flags[i]
}
return(data)
}
# Apply the function to the dataset
data_with_outliers <- add_outlier_columns(data, "count")
# Display the first few rows of the modified dataset
head(data_with_outliers)
此方法首先计算 IQR 以确定数据点是否为异常值。对于每个数据点,都会向
data
添加一个新列,以指示与之前的数据相比它是否为异常值。如果数据点被识别为异常值,根据基于先前值的 IQR 标准,异常值列将使用 NA
进行初始化,并使用 1
进行更新。