我有以下数据框:
set.seed(3994)
val <- round(runif(n=30, min = 5, max= 300), digits=0)
cat <- rep(c("A", "B", "C"), each= 10)
date <- as.Date(sample(seq(as.Date('2000/01/01'), as.Date('2020/01/01'), by="day"), 30))
df <- data.frame(val, cat, date)
df <- df %>%
arrange(cat, val)
我想根据第cat
列来裁剪每个类别数据的顶部X%和底部X%.例如,我想删除类别"A"、"B"和"C"的最高2%和最低2%.当数据基于val
列进行排序时.
我编写了以下代码:
trimTopBottomByCategory <- function(dataframe, category_col, numeric_col, date_column, x) {
trimmed_dataframes <- list()
categories <- unique(dataframe[[category_col]])
for (category in categories) {
subset_df <- dataframe[dataframe[[category_col]] == category, ]
n <- nrow(subset_df)
num_to_trim <- ceiling(x / 100 * n)
sorted_subset <- subset_df[order(subset_df[[numeric_col]]), ]
trimmed_df <- sorted_subset[(num_to_trim + 1):(n - num_to_trim), ]
trimmed_dataframes[[category]] <- trimmed_df
}
trimmed_combined <- do.call(rbind, trimmed_dataframes)
return(trimmed_combined <- trimmed_combined %>%
arrange(category_col, date_column))
}
My Question:我希望我的代码正在做它应该做的事情.但我想知道在R中是否有一个方法可以做同样的事情?
Bonus Question:我不明白我的最终数据没有针对date
列进行排序