r - 在 data.table 中使用唯一但跟踪原始行(例如唯一然后匹配)
问题描述
我对这个美好社区的第一个问题:
我想知道是否有更有效的方法来执行此操作,但使用 data.table:
# vector example
all <- c(4,4,2,1,2)
(uniq <- unique(all))
## [1] 4 2 1
match(all,uniq)
## [1] 1 1 2 3 2
这个想法是从 data.table 中获取所有唯一行,但同时,为原始 data.table 的每一行识别它与唯一 DT 的哪一行匹配。也许下面的例子更清楚。
编辑:我想要的输出是具有唯一行的数据表和具有唯一行表中原始表行位置的向量(即长度向量nrow(dt)
)
这是迄今为止我发现的最佳解决方案:
library(data.table) # data.table 1.12.0
# small data.table example ## edited to be reproducible
m <- matrix(c(5, 5, 5, 5, 6, 5, 6, 6, 7, 7, 5, 5, 7, 5, 6, 6), nrow = 8, ncol = 2)
dt <- setDT(as.data.frame(m))
dt.uniq <- unique(dt)
#this returns the ID or position of the rows in the first table on the second table
match(transpose(dt), transpose(dt.uniq))
## [1] 1 1 2 2 3 2 4 4
解决方案
这是data.table
版本 1.12.4 的一种可能方法:
DT[, urow := unique(DT)[DT, on=.NATURAL, which=TRUE]]
输出:
V1 V2 urow
1: 7 5 1
2: 5 6 2
3: 6 5 3
4: 7 6 4
5: 7 7 5
6: 7 6 4
7: 7 5 1
8: 6 6 6
数据:
library(data.table) #data.table_1.12.4
set.seed(9L)
DT <- as.data.table(matrix(sample(5:7, 16, replace = T), nrow = 8, ncol = 2))
DT
编辑以解决评论:
1)on=.NATURAL
从?data.table
下面的参数部分on
:
当提供 .NATURAL 关键字时,会进行自然连接(在公共列上连接)。
也就是说,在 中X[Y, on=.NATURAL]
,用于连接的键是在 X 和 Y ( )中都可以找到的列。intersect(names(X), names(Y))
2)which=TRUE
从?data.table
下面的参数部分which
:
TRUE 返回 i 匹配的 x 的行号。如果 NA,则返回在 x 中不匹配的 i 的行号。默认情况下 FALSE 并返回 x 中匹配的行。
也就是说,x
(unique(DT)
在 OP 中) 的行索引是从与i
(DT
这里) 的连接中返回的。
推荐阅读
- minecraft - 如何获取服务器 minecraft 的重启命令以工作 1.16.3
- amazon-web-services - ECS Fargate 的间歇性 HTTP 请求超时
- c - 在现代 OpenGL 中渲染三角形时遇到问题
- ios - 删除 ios textPassword 的延迟
- swift - WebSocket在xcode上的不同模块错误中有不同的定义
- r - 在 r 中使用跨组聚合的加权平均值
- html - 如何在一行上获取文本
- sql - Azure SQL 数据库重命名失败(错误 1801:已存在)但 DB 不存在
- python - 尝试使用正则表达式在 python 中实现函数来验证输入?
- c++ - C ++用户输入x数量的输入而不是总和