我有以下 Dataframe :
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))
}
**我的问题:**我希望我的代码正在做它应该做的事情。但是我想知道R中是否有一个方法可以做到同样的事情?
**附加问题:**我不明白我的最终数据没有为date
列排序
2条答案
按热度按时间fcg9iug31#
order
通过 cat 和 data,而不是通过 cat 和 * 瓦尔 *。(应该也可以使用dplyr::arrange
,但我不想加载dplyr
。可以使用
ave
,其中第一个参数是value val,第二个参数是类别 cat。ave
将FUN
应用于每个类别中的值。为了得到最高和最低的2%,我们可以使用quantile
,然后比较这些值。实际上它是布尔值,但由于val
是数值型的,我们得到的是数值型的,所以我们使用as.logical
来得到所需的布尔值,然后我们可以生成ss
来子集化 Dataframe 。aoyhnmkz2#
下面是一个dupiter选项: