我已經使用下面的命令許多獨特的觀測值的變量通過在數據表
data <- as.data.set(spss.system.file(paste(path, file, sep = '/')))
該數據集包含其不應當屬於列讀取一個大的數據文件轉換爲R,並且只包含空白。這個問題與R根據附加到SPSS文件的變量標籤(Source)創建新變量有關。
不幸的是,我一直無法確定解決問題所需的選項。我已經嘗試了所有:foreign :: read.spss,memisc:spss.system.file和Hemisc :: spss.get,但沒有運氣。相反,我想讀取整個數據集(使用ghost列)並手動刪除不必要的變量。由於鬼列只包含空格,因此我想從我的data.table中刪除任何獨特觀察值等於1的變量。
我的數據很大,所以它們以data.table格式存儲。我想確定一個簡單的方法來檢查每列中唯一觀察值的數量,並刪除只包含一個唯一觀察值的列。
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是合理的,因爲它是一個包含1個變量的data.table。我們知道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正如我所說的,我有我可以簡化我的做法的感覺......但我不會拿出解決方案。該死,這很整潔... –