子集基于观察的数目的因子可变(subsetting based on number of obser

2019-07-29 09:13发布

你如何根据因子变量的水平的观测数子集? 我有1,000,000行和近3000水平的数据集,我想子集出来的水平与少说200周的观察。

data <- read.csv("~/Dropbox/Shared/data.csv", sep=";")

summary(as.factor(data$factor)
10001 10002 10003 10004 10005 10006 10007 10009 10010 10011 10012 10013 10014 10016        10017 10018 10019 10020 
  414   741  2202   205   159   591   194   678   581   774   778   738  1133   997   381   157   522     6 
10021 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 
  398   416  1236   797   943   386   446   542   508   309   452   482   425   272   261   291   145   598 
10039 10040 10041 10043 10044 10065 10069 10075 10080 10104 10105 10106 10110 10112 10115 10117 10119 10121 
  119   263     9     9   179   390    70   465    19     3     7     5     4     1     1     1     2     6 
10123 10128 10150 10152 10154 10155 10168 10170 10173 10174 10176 10199 10210 10220 10240 10265 10270 10271 
    2   611     8     1     1     2    10     1     6     5     5     2     5     2     1     3     5     2 

当你从汇总看,上面也有只有少数OBS因素,我想删除具有小于100的因素。

我尝试以下,但它没有工作:

for (n in unique((data$factor))) {
    m<-subset(data, factor==n)
    o<-length(m[,1])
    data<-ifelse( o<100, subset(data, factor!=n), data)
}

Answer 1:

table ,子集,并匹配基于该子集的名称。 可能会想droplevels其后。


EIDT

一些样本数据:

set.seed(1234)
data <- data.frame(factor = factor(sample(10000:12999, 1000000, 
  TRUE, prob=rexp(3000))))

有一些类别,有少数病例

> min(table(data$factor))
[1] 1

从壳体具有小于100那些具有相同的值的删除记录factor

tbl <- table(data$factor)
data <- droplevels(data[data$factor %in% names(tbl)[tbl >= 100],,drop=FALSE])

校验:

> min(table(data$factor))
[1] 100

需要注意的是datafactor都没有很好的名字,因为他们也内建函数。



Answer 2:

我想通了使用以下,因为没有理由做的事情两次:

function (df, column, threshold) { 
    size <- nrow(df) 
    if (threshold < 1) threshold <- threshold * size 
    tab <- table(df[[column]]) 
    keep <- names(tab)[tab >  threshold] 
    drop <- names(tab)[tab <= threshold] 
    cat("Keep(",column,")",length(keep),"\n"); print(tab[keep]) 
    cat("Drop(",column,")",length(drop),"\n"); print(tab[drop]) 
    str(df) 
    df <- df[df[[column]] %in% keep, ] 
    str(df) 
    size1 <- nrow(df) 
    cat("Rows:",size,"-->",size1,"(dropped",100*(size-size1)/size,"%)\n") 
    df[[column]] <- factor(df[[column]], levels=keep) 
    df 
}


文章来源: subsetting based on number of observations in a factor variable