我正在从数据框和矩阵迁移到数据表,但还没有找到从数据表中提取唯一行的解决方案.[,J]虽然我还没有在常见问题解答和介绍插图中找到答案,但我认为有一些我对符号的遗漏.如何在不转换回数据帧的情况下提取唯一行?
这是一个例子:
library(data.table)
set.seed(123)
a <- matrix(sample(2, 120, replace = TRUE), ncol = 3)
a <- as.data.frame(a)
b <- as.data.table(a)
# Confirm dimensionality
dim(a) # 40 3
dim(b) # 40 3
# Unique rows using all columns
dim(unique(a)) # 8 3
dim(unique(b)) # 34 3
# Unique rows using only a subset of columns
dim(unique(a[,c("V1","V2")])) # 4 2
dim(unique(b[,list(V1,V2)])) # 29 2
Run Code Online (Sandbox Code Playgroud)
相关问题:这种行为是否与Unix uniq函数一样是未排序数据的结果?
一个简单的问题简单的貌似无辜的功能:summary.
直到我看到Min和Max的结果超出了我的数据范围,我才意识到它summary有一个digits参数来指定输出结果的精度.我的问题是如何以干净,普遍的方式解决这个问题.
以下是此问题的示例:
set.seed(0)
vals <- 1 + 10 * 1:50000
df <- cbind(rnorm(10000),sample(vals, 10000), runif(10000))
Run Code Online (Sandbox Code Playgroud)
应用summary和range,我们得到以下输出 - 注意范围值与最小值和最大值之间的差异:
> apply(df, 2, summary)
[,1] [,2] [,3]
Min. -3.703000 11 6.791e-05
1st Qu. -0.668500 122800 2.498e-01
Median 0.009778 248000 5.014e-01
Mean 0.010450 248800 5.001e-01
3rd Qu. 0.688800 374000 7.502e-01
Max. 3.568000 499900 9.999e-01
> apply(df, 2, range)
[,1] [,2] [,3]
[1,] -3.703236 11 6.790622e-05
[2,] 3.568101 499931 …Run Code Online (Sandbox Code Playgroud) [更新1:正如Matthew Dowle所说,我data.table在R-Forge上使用的是1.6.7版本,而不是CRAN.您不会在早期版本中看到相同的行为data.table.]
作为背景:我正在移植一些小实用程序函数来对数据帧的行或数据帧对进行集合操作(即每行是一个集合中的元素),例如唯一 - 从列表中创建集合,union,交叉点,设置差,等,这些模拟物Matlab的intersect(...,'rows'),setdiff(...,'rows')等等,这似乎不具有R中的对应(R的集合操作仅限于载体和列表,而不是基质或数据帧的行).这些小功能的例子如下.如果数据框的这种功能已经存在于某个包或基础R中,我愿意接受建议.
我一直在将这些迁移到数据表,当前方法中的一个必要步骤是查找重复的行.当duplicated()执行返回一个错误,指出数据表必须有钥匙.这是一个不幸的障碍 - 除了设置密钥,这不是一个通用的解决方案,并增加计算成本,还有其他方法来查找重复的对象?
这是一个可重复的例子:
library(data.table)
set.seed(0)
x <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))
y <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))
res3 <- dt_intersect(x,y)
Run Code Online (Sandbox Code Playgroud)
产生此错误消息:
Error in duplicated.data.table(z_rbind) : data table must have keys
Run Code Online (Sandbox Code Playgroud)
代码按原样用于数据帧,尽管我已经用模式命名了每个函数dt_operation.
有没有办法解决这个问题?设置键仅适用于整数,这是我不能为输入数据假设的约束.那么,也许我错过了一种使用数据表的聪明方法?
示例设置操作函数,其中集合的元素是数据行:
dt_unique <- function(x){
return(unique(x))
}
dt_union <- function(x,y){
z_rbind <- rbind(x,y)
z_unique <- dt_unique(z_rbind)
return(z_unique)
}
dt_intersect <- function(x,y){
zx <- …Run Code Online (Sandbox Code Playgroud)