gpt4 book ai didi

r - 数据表中不同变量的唯一观测数

转载 作者:行者123 更新时间:2023-12-04 10:19:06 24 4
gpt4 key购买 nike

我已使用以下命令将大数据文件读入 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 中只有一个独特的观察结果时删除观察结果会更好。

最佳答案

更新:uniqueN从 1.9.6 版开始,此解决方案有一个内置(优化)版本,uniqueN功能。现在这很简单:

dt[ , lapply(.SD, uniqueN)]

如果要查找每列中唯一值的数量,例如
 dt[, lapply(.SD, function(x) length(unique(x)))]
## a b c
## 1: 10 10 1
要使您的功能正常工作,您需要使用 with=FALSE[.data.table ,或者简单地使用 [[相反(阅读 fortune(312) 以及...)
lapply(names(df) function(x) length(unique(dt[, x, with = FALSE])))
或者
 lapply(names(df) function(x) length(unique(dt[[x]])))
将工作
一步
dt[,names(dt) := lapply(.SD, function(x) if(length(unique(x)) ==1) {return(NULL)} else{return(x)})]


# or to avoid calling `.SD`

dt[, Filter(names(dt), f = function(x) length(unique(dt[[x]]))==1) := NULL]

关于r - 数据表中不同变量的唯一观测数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com