删除R中数据集中组的顶部和底部十分位数

时间:2017-01-23 20:06:59

标签: r

我的数据集类似于以下数据

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组的顶部和底部十进制以进行汇总统计,但保留数据的格式相同。

4 个答案:

答案 0 :(得分:2)

基础R替代方案是将findIntervalquantile合并以获得带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

avedf$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)

另一种方法。首先,我加载库并创建数据表。

# 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创建