我已使用以下命令将大型数据文件读入 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,但没有运气。
相反,我想读取整个数据集(带有幽灵列)并手动删除不必要的变量。由于幽灵列仅包含空格,因此我想从我的 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 中只有一个唯一观察值的情况下如何删除观察结果,那就更好了。