2012-05-11 6 views
0

ファクタ変数のレベルの観測数に基づいてどのようにサブセット化しますか?私は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 
1
    2 611  8  1  1  2 10  1  6  5  5  2  5  2  1  3  5  2 

サマリーから見ると、上記の、そこにわずか数OBSとの要因である、と私は100未満

を持っている要因を削除したい私は、次のことを試してみましたが、それはdidnの

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

答えて

6

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]) 

チェック:彼らはまた、組み込み関数なのでdatafactorは非常に良い名前がないことを

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

注意。二回物事を行うには理由がないとして

+0

を用事、私はそれを考え出しました。 – cconnell

1

は、私は、以下を使用してそれを考え出し:

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 
} 
関連する問題