2

私はRの初心者で、遭遇した問題について質問があります。

  • 非常に大きなデータセット (約 80 万行)
  • このデータセットには、米国の 90 年代の政治家へのすべての貢献がリストされています

データをクリーニングした後、リストをより管理しやすいサイズに縮小する必要がありました。複数回寄付してくださった寄稿者に興味があるので、データセットのサイズをそのように制限することにしました。

データセットは「cont」としてロードされます

私の意図:

  1. 言及頻度のマッピング:

    > table(cont$contributor_name) -> FreqCon
    > subset(FreqCon,Freq>4) -> FMI
    
  2. サブセット化する必要があるかどうかについてTRUEまたはFALSEとなる「include」という名前の追加の列をcont [、43]として挿入します

    for(i in 1:dim(FMI)[1]){
    + ifelse(cont[i,11] %in% FMI[,1],cont[i,43] <- TRUE, cont[i,43] <- FALSE) }
    
  3. 以下に基づいてデータセットをサブセット化しますcont$include

それがすべての関連情報であることを願っています。必要に応じて、さらに情報を提供させていただきます。また:cont[,11] = cont$contributor_name

問題点: 現在、Rは非常に熱心に取り組んでいますが、コラムの内容は何も変わっていないようです。warnings()エラーが発生しないため、何が間違っているのか混乱しています。

たぶん私は車輪を再発明しようとしているので、私がやろうとしていることを達成する方法は大歓迎です!

4

2 に答える 2

4

ループは必要ありません。これは、ベクトル化が解決するように設計された種類の問題です。

FreqCon <- table(cont$contributor_name)
FMI <- names(FreqCon)[FreqCon > 4]
small_cont <- subset(cont, contributor_name %in% FMI)
于 2013-04-16T11:24:05.880 に答える
3

周波数でサブセット化しようとしているようです。その場合、次のようなものが機能するはずです。

mydf[mydf$V1 %in% names(which(table(mydf$V1) > 1)), ]
#    V1          V2
# 4   s -0.30538839
# 5   e  1.51178117
# 7   s -0.62124058
# 11  e -0.01619026

ロジックはtable、"V1" 列 (データセットの "contributor_name") を実行するだけで、条件に一致するものを特定するだけです (ここでは、複数回発生する任意の "V1" に設定しました)。

中間ステップとして別の列を作成する必要はありません。

これが本当にあなたが求めているものであり、大きなデータがある場合は、data.tableパッケージの使用を検討することをお勧めします:

> library(data.table)
> DT <- data.table(mydf)
> DT[, N := .N, by = "V1"][N > 1]
   V1          V2 N
1:  s -0.30538839 2
2:  e  1.51178117 2
3:  s -0.62124058 2
4:  e -0.01619026 2

上記では、 forに.N似ており、新しい列 (この場合は "N" という名前) を作成します。構文はベース R とは少し異なりますが、大きなデータに対してははるかに効果的です。tabledata.table


これらの例でmydfは、 は次のように定義されています。

set.seed(1)
mydf <- data.frame(V1 = sample(letters[1:20], 12, replace = TRUE), 
                   V2 = rnorm(12))
#    V1          V2
# 1   f  0.48742905
# 2   h  0.73832471
# 3   l  0.57578135
# 4   s -0.30538839
# 5   e  1.51178117
# 6   r  0.38984324
# 7   s -0.62124058
# 8   n -2.21469989
# 9   m  1.12493092
# 10  b -0.04493361
# 11  e -0.01619026
# 12  d  0.94383621
于 2013-04-16T11:23:25.343 に答える