我只想用NA为每个单独的组替换异常值(高于99%的那些值)。我不知道如何在不创建冗余的全新数据帧的情况下执行此操作。有什么想法吗?
group <- c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B')
var1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 50, 1, 2, 3, 4, 5, 6, 7, 8, 9, 50)
df = data.frame(group, var1)
unique_groups = unique(df$group)
df2 = data.frame()
for(g in 1:length(unique_groups)) {
subset_df <- df[grep(unique_groups[1], df$group), ]
quantiles <- quantile(subset_df$var1, c(.01, .99), na.rm = TRUE)
subset_df$var1[subset_df$var1 > quantiles[2]] <- NA
df2 <- rbind(df2, subset_df)
}
谢谢
答案 0 :(得分:4)
使用dplyr的另一种方法
library(dplyr)
df %>%
group_by(group) %>%
mutate(var1 = ifelse(var1 > quantile(var1, .99), NA, var1))
您还可以进行过滤以保持值满足条件
df %>%
group_by(group) %>%
filter(var1 <= quantile(var1, .99))
答案 1 :(得分:0)
使用ave
。
df$var1[with(df, !!ave(var1, group, FUN=function(x) x > quantile(x, .99)))] <- NA
df
# group var1
# 1 A 1
# 2 A 2
# 3 A 3
# 4 A 4
# 5 A 5
# 6 A 6
# 7 A 7
# 8 A 8
# 9 A 9
# 10 A NA
# 11 B 1
# 12 B 2
# 13 B 3
# 14 B 4
# 15 B 5
# 16 B 6
# 17 B 7
# 18 B 8
# 19 B 9
# 20 B NA
答案 2 :(得分:0)
您还可以使用replace()
和quantile()
创建索引:
df$var1 = replace(df$var1, df$var1 >= quantile(df$var1, .99), NA)