gpt4 book ai didi

r - 使用 data.table 在 R 中查找

转载 作者:行者123 更新时间:2023-12-04 22:29:50 27 4
gpt4 key购买 nike

我有一个数据集,其中包含对一个人的重复观察的长格式。所以每一行都作为一个类型 AB 观察。以下代码重现了数据集。

library(data.table)
set.seed(1487)
dat <- data.table(id = rep(seq(10), 2),
type = c(rep("A", 10), rep("B", 10)),
x = sample.int(100,20))
dat
# id type x
# 1: 1 A 38
# 2: 2 A 58
# 3: 3 A 28
# 4: 4 A 21
# 5: 5 A 19
# 6: 6 A 62
# 7: 7 A 52
# 8: 8 A 86
# 9: 9 A 85
# 10: 10 A 90
# 11: 1 B 15
# 12: 2 B 11
# 13: 3 B 37
# 14: 4 B 93
# 15: 5 B 34
# 16: 6 B 91
# 17: 7 B 79
# 18: 8 B 94
# 19: 9 B 24
# 20: 10 B 41

然后,我为两种类型的观察选择了 x 排名前 3 的个体:
setorderv(dat, c("type", "x"), c(1, -1))
top3 <- dat[, head(.SD, 3), by = list(type)]
top3
# type id x
# 1: A 10 90
# 2: A 8 86
# 3: A 9 85
# 4: B 8 94
# 5: B 4 93
# 6: B 6 91

现在我想添加一个包含相反观察类型的原始 x 值的列。如果那有意义的话。因此,以下代码重现了我正在寻找的内容:
top3[,x2 := c(41, 94, 24, 86, 21, 62)]
# type id x x2
# 1: A 10 90 41
# 2: A 8 86 94
# 3: A 9 85 24
# 4: B 8 94 86
# 5: B 4 93 21
# 6: B 6 91 62

当然,我可以逐行浏览整个数据集并使用 if 语句或其他任何内容。原始数据集很大,我正在寻找一种优雅而有效的方法来做到这一点。我真的很喜欢 data.table,最近我一直在使用它。我知道有一种简单而优雅的方法可以做到这一点。我也尝试过使用 .GRP 。我需要帮助。

提前致谢!

我的最终解决方案

感谢那些提供灵感的人。那些感兴趣的人这是我对我的问题的有效解决方案,实际上对项目的意图更有效。
dat <- dcast.data.table(dat, id~type, value.var = "x")
top3 <- rbind(dat[order(-A), head(.SD, 3L)][,rank_by := "A"],
dat[order(-B), head(.SD, 3L)][,rank_by := "B"])
# id A B rank_by
# 1: 10 90 41 A
# 2: 8 86 94 A
# 3: 9 85 24 A
# 4: 8 86 94 B
# 5: 4 21 93 B
# 6: 6 62 91 B

干杯,

特斯泰夫

最佳答案

似乎您想通过 id 和相反类型合并回来。根据您的特定情况,我可能会跳过更改类型,并合并两种类型,并丢弃相同的类型(下面的代码假定版本 1.9.5+ ):

(dat[order(-x), head(.SD, 3), by = type]
[dat, on = 'id', nomatch = 0][type != i.type]
[order(type, -id)])
# type id x i.type i.x
#1: A 10 90 B 41
#2: A 8 86 B 94
#3: A 9 85 B 24
#4: B 8 94 A 86
#5: B 4 93 A 21
#6: B 6 91 A 62

关于r - 使用 data.table 在 R 中查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31992901/

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