1

因子変数のレベルの観測数に基づいてどのようにサブセット化しますか? 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)
}
4

2 に答える 2

7

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

dataandfactorは組み込み関数でもあるため、あまり良い名前ではないことに注意してください。

于 2012-05-11T17:38:32.093 に答える
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 
}
于 2012-05-12T01:53:25.730 に答える