次のコマンドを使用して、大きなデータ ファイルを R に読み込みました。
data <- as.data.set(spss.system.file(paste(path, file, sep = '/')))
データ セットには、属してはならない列が含まれており、空白のみが含まれています。この問題は、R が SPSS ファイル ( Source )に添付された変数ラベルに基づいて新しい変数を作成することに関係しています。
残念ながら、問題を解決するために必要なオプションを特定できませんでした。私は、foreign::read.spss、memisc:spss.system.file、および Hemisc::spss.get のすべてを試しましたが、うまくいきませんでした。
代わりに、データ セット全体 (ゴースト列を含む) を読み込み、不要な変数を手動で削除したいと考えています。ゴースト列には空白しか含まれていないため、一意の観測値の数が 1 である変数を data.table から削除したいと思います。
私のデータは大きいので、data.table 形式で保存されます。各列の一意の観測の数を確認し、一意の観測を 1 つだけ含む列を削除する簡単な方法を決定したいと思います。
require(data.table)
### Create a data.table
dt <- data.table(a = 1:10,
b = letters[1:10],
c = rep(1, times = 10))
### Create a comparable data.frame
df <- data.frame(dt)
### Expected result
unique(dt$a)
### Expected result
length(unique(dt$a))
ただし、大きなデータ ファイルの obs の数を計算したいので、各列を名前で参照することは望ましくありません。私は eval(parse()) のファンではありません。
### I want to determine the number of unique obs in
# each variable, for a large list of vars
lapply(names(df), function(x) {
length(unique(df[, x]))
})
### Unexpected result
length(unique(dt[, 'a', with = F])) # Returns 1
私には問題があるようです
dt[, 'a', with = F]
クラス「data.table」のオブジェクトを返します。このオブジェクトは 1 つの変数を含む data.table であるため、このオブジェクトの長さが 1 であることは理にかなっています。data.frames は実際には単なる変数のリストであることを知っているので、この場合、リストの長さはちょうど 1 です。
data.frame の方法を使用して、ソリューションを修正する方法の擬似コードを次に示します。
for (x in names(data)) {
unique.obs <- length(unique(data[, x]))
if (unique.obs == 1) {
data[, x] <- NULL
}
}
data.table の列ごとに一意の観測値の数をより効率的に求める方法についての洞察をいただければ幸いです。または、data.table 内に一意の観測が 1 つしかない場合に観測を削除する方法を推奨できる場合は、さらに良いでしょう。