我的数据集类似于以下数据
Type Count
A 0.022496545
A 0.969600752
A 0.476144762
A 0.142649351
A 0.902891034
A 0.004099406
A 0.80460619
A 0.642014007
A 0.688212724
A 0.879709931
B 0.886410732
B 0.803057447
B 0.203613404
B 0.606411333
B 0.886645412
B 0.418132624
B 0.653509209
B 0.70379929
B 0.071641697
C 0.248229147
C 0.534882145
C 0.445638266
C 0.527329119
C 0.382053332
C 0.121013092
C 0.922702539
我想删除每个A,B和C组的顶部和底部十进制以进行汇总统计,但保留数据的格式相同。
答案 0 :(得分:2)
基础R替代方案是将findInterval
和quantile
合并以获得带ave
的十进制分组。
df$decGroups <- ave(df$Count, df$Type,
FUN=function(i) findInterval(i, c(-Inf, quantile(i, probs=c(0.1, 0.9)))))
df$decGroups
[1] 2 3 2 2 2 1 2 2 2 2 2 2 2 2 3 2 2 2 1 2 2 2 2 2 1 3
ave
在df$count
上运行,并按df$Type
进行拆分。应用于每种类型的函数首先使用quantile
计算顶部和底部十进制的值,然后使用findIntervals
指示这些观察结果。
使用输出,您可以看到您希望将所有元素保留为2。
df <- df[df$decGroups == 2,]
答案 1 :(得分:1)
我们可以使用dplyr
。在按&#39;类型&#39;分组后,我们filter
&#39;计数&#39;位于90%
和10%
分位数级别之间的值
library(dplyr)
df1 %>%
group_by(Type) %>%
filter(between(Count, quantile(Count, 0.1), quantile(Count, 0.9)))
或者我们可以使用data.table
library(data.table)
setDT(df1)[df1[, .I[between(Count, quantile(Count, 0.1),
quantile(Count, 0.9))], by = Type]$V1]
或使用此方法的base R
是
df1[with(df1, as.logical(ave(Count, Type, FUN = function(x)
x >= quantile(x, 0.10) & x <= quantile(x, 0.9)))),]
答案 2 :(得分:0)
假设您的初始数据位于名为“initialdata”的data.frame中,其中第一列是因子变量,我会这样做:
a)两个步骤:
1º)从每种类型的 initialdata 中删除10%和90%十分位数:
filtereddatalist <- lapply(X = split(x=initialdata, f=initialdata$Type),
FUN = function(x){
decilesboundaries <- quantile(x[,2],probs=c(0.10,0.90));
return(x[which(x[,2]>=decilesboundaries[1] & x[,2]<= decilesboundaries[2]),])
}
)
2º)将filtereddatalist格式化为 finaldatamatrix (初始格式,Matrix我猜):
finaldatamatrix <- NULL; lapply(X = filtereddatalist,FUN = function(x) {
finaldatamatrix <<-rbind(finaldatamatrix,x)
})
b)或全部:
finaldatamatrix <- NULL;lapply(X = split(x=initialdata, f=initialdata$Type),
FUN = function(x){
decilesboundaries <- quantile(x[,2],probs=c(0.10,0.90));
x <- x[which(x[,2]>=decilesboundaries[1] & x[,2]<= decilesboundaries[2]),]
finaldatamatrix <<-rbind(finaldatamatrix,x)
})
答案 3 :(得分:0)
另一种data.table方法。首先,我加载库并创建数据表。
# Load data table
library(data.table)
# Create data table
dt <- fread(text = "Type Count
A 0.022496545
A 0.969600752
A 0.476144762
A 0.142649351
A 0.902891034
A 0.004099406
A 0.80460619
A 0.642014007
A 0.688212724
A 0.879709931
B 0.886410732
B 0.803057447
B 0.203613404
B 0.606411333
B 0.886645412
B 0.418132624
B 0.653509209
B 0.70379929
B 0.071641697
C 0.248229147
C 0.534882145
C 0.445638266
C 0.527329119
C 0.382053332
C 0.121013092
C 0.922702539")
然后,我将Type
分组并过滤每个组,其中Count
是%between%
的10%和90%的分位数。
# Subset
dt[, .SD[Count %between% quantile(Count, c(0.1, 0.9))], by = Type]
#> Type Count
#> 1: A 0.02249654
#> 2: A 0.47614476
#> 3: A 0.14264935
#> 4: A 0.90289103
#> 5: A 0.80460619
#> 6: A 0.64201401
#> 7: A 0.68821272
#> 8: A 0.87970993
#> 9: B 0.88641073
#> 10: B 0.80305745
#> 11: B 0.20361340
#> 12: B 0.60641133
#> 13: B 0.41813262
#> 14: B 0.65350921
#> 15: B 0.70379929
#> 16: C 0.24822915
#> 17: C 0.53488214
#> 18: C 0.44563827
#> 19: C 0.52732912
#> 20: C 0.38205333
由reprex package(v0.3.0)于2019-12-02创建