gpt4 book ai didi

r - 数据集中哪些变量在 id 内是常量

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

我有一个数据集,其中每个人都有一堆几乎重复的观察结果。我试图准确确定每个特定 ID 的行之间哪些变量发生变化。

我从检查开始:

dt[ , count := .N, by = id][count > 1, ]

(也使用 headtail),但有 27000(总共)重复观察 - 无法通过检查来确定哪些变量正在发生变化。

还有什么比暴力破解更好的方法吗?特别是我希望避免循环,但我不知道如何...

dt[ , count := .N, by = id]
for (var in setdiff(names(dt), c("id", "count"))){
if (nrow(dt[ , list(.N, count), by = c("id", var)][N < count, ]) > 0){
print(var)
}
}

编辑

下面是一个需要澄清的示例数据集:

set.seed(2304)
DT <- data.table(a = rep(sample(5), each = 3),
b = sample(15),
c = rep(LETTERS[1:5], each = 3),
d = rnorm(15),
e = rep(6:10, each = 3),
f = 15:1,
grp = paste0("Group ", rep(1:5, each = 3)))

期望的输出:

c("a", "c", "e")

因为这些变量不会因grp任何固定值而改变。

最佳答案

假设 mtcars$carb 是我们的 id。然后,对于每个 id 的每个数字,我们想要找出有多少个不同的 gear 值:

data.table(mtcars)[, lapply(.SD, function(x) length(unique(x))), by=carb]

产品

   carb mpg cyl disp hp drat wt qsec vs am gear
1: 4 8 2 8 7 8 9 10 2 2 3
2: 1 7 2 7 6 6 7 7 1 2 2
3: 2 9 2 10 8 9 10 10 2 2 3
4: 3 3 1 1 1 1 3 3 1 1 1
5: 6 1 1 1 1 1 1 1 1 1 1
6: 8 1 1 1 1 1 1 1 1 1 1

任何值 > 1 的变量对于每个 carb 值都有变化的值。


编辑:

或者,我们可以通过运行来扩展它:

data.table(mtcars)[,lapply(.SD,uniqueN),by=carb
][,!"carb"][,lapply(.SD,table)]

mpg cyl disp hp drat wt qsec vs am gear
1: 2 3 3 3 3 2 2 4 3 3
2: 1 3 1 1 1 1 1 2 3 1
3: 1 3 1 1 1 1 1 4 3 2
4: 1 3 1 1 1 1 2 2 3 3
5: 1 3 3 3 3 1 2 4 3 1

这样做的优点是(在此示例数据集中不明显),仅当上述代码的输出恒定且等于 length(unique(id)) 在相应的列中。 carb 有 6 个值,因此我们可以看到 mtcars 中的变量没有carb 中是常量。此外,如果我们有很多 ID(在当前示例中我有 >50,000 个),则上述方法将很难直接解释。

坚持使用mtcars,我们可以看到disp中有一些常量变量:

data.table(mtcars)[,lapply(.SD,uniqueN),by=disp
][,!"disp"][,lapply(.SD,table)]

mpg cyl hp drat wt qsec vs am gear carb
1: 24 27 26 26 24 23 27 27 27 26
2: 2 27 1 1 2 3 27 27 27 1
3: 1 27 26 26 1 1 27 27 27 26

因此,vsamgeardisp 内是恒定的。

关于r - 数据集中哪些变量在 id 内是常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28858861/

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