我正在从数据框和矩阵迁移到数据表,但还没有找到从数据表中提取唯一行的解决方案.[,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函数一样是未排序数据的结果?
我开始相信数据框没有矩阵优势,除了符号方便.但是,当unique在矩阵和数据帧上运行时,我注意到这种奇怪:它似乎在数据帧上运行得更快.
a = matrix(sample(2,10^6,replace = TRUE), ncol = 10)
b = as.data.frame(a)
system.time({
u1 = unique(a)
})
user system elapsed
1.840 0.000 1.846
system.time({
u2 = unique(b)
})
user system elapsed
0.380 0.000 0.379
Run Code Online (Sandbox Code Playgroud)
随着行数的增加,定时结果更加明显.所以,这个问题有两个部分.
为什么矩阵的速度会变慢?转换为数据帧,运行unique,然后转换回来似乎更快.
有什么理由不只是包装unique中myUnique,它执行转换部分#1?
注意1.鉴于矩阵是原子的,unique对于矩阵来说似乎应该更快,而不是更慢.能够迭代固定大小的连续内存块通常比运行在链接列表的单独块上更快(我假设数据帧是如何实现的......).
注2:如表现所示data.table,unique在数据框或矩阵上运行是一个相对糟糕的想法 - 请参阅Matthew Dowle的答案和相关时间的评论.我已经将很多对象迁移到数据表中,这种性能是另一个原因.因此,尽管用户应该很好地采用数据表,但出于教学/社区的原因,我现在要问的问题是,为什么这需要花费更长的时间来处理矩阵对象.下面地址的答案,其中没有时间去了,怎么回事,我们可以得到更好的性能(即数据表).这个问题的答案,为什么就在眼前-该代码可以通过发现unique.data.frame和unique.matrix.:)一个英语解释它正在做什么以及为什么缺乏这一切.
如果我想选择data.table中使用二进制搜索在键变量中不包含特定值的所有行,会发生什么?顺便问一下,我想做什么的正确行话是什么?它是"nojoin"吗?这是"消极选择"吗?
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)
Run Code Online (Sandbox Code Playgroud)
让我们对x =="a"但使用二进制搜索的所有行进行正选择
DT["a"]
Run Code Online (Sandbox Code Playgroud)
这很美,但我希望与此相反.我想要所有不是"a"的行,换句话说x!="a"
DT[x!="a"]
Run Code Online (Sandbox Code Playgroud)
那是矢量扫描.以上线路工作但使用矢量扫描.我想用二进制文件.我期待以下工作,但唉......
DT[!"a"]
DT[-"a"]
Run Code Online (Sandbox Code Playgroud)
以上两个不起作用,尝试与无匹配发挥让我无处可去.
我有一个关于data.table"非连接"成语的问题,灵感来自Iterator的问题.这是一个例子:
library(data.table)
dt1 <- data.table(A1=letters[1:10], B1=sample(1:5,10, replace=TRUE))
dt2 <- data.table(A2=letters[c(1:5, 11:15)], B2=sample(1:5,10, replace=TRUE))
setkey(dt1, A1)
setkey(dt2, A2)
Run Code Online (Sandbox Code Playgroud)
这data.table看起来像这样
> dt1 > dt2
A1 B1 A2 B2
[1,] a 1 [1,] a 2
[2,] b 4 [2,] b 5
[3,] c 2 [3,] c 2
[4,] d 5 [4,] d 1
[5,] e 1 [5,] e 1
[6,] f 2 [6,] k 5
[7,] g 3 [7,] l 2
[8,] h 3 [8,] …Run Code Online (Sandbox Code Playgroud) R的data.table包提供基于键的快速子集值.
所以,例如:
set.seed(1342)
df1 <- data.table(group = gl(10, 10, labels = letters[1:10]),
value = sample(1:100))
setkey(df1, group)
df1["a"]
Run Code Online (Sandbox Code Playgroud)
将返回df1中的所有行,其中group =="a".
如果我想在所有行df1其中group != "a".是否有使用的简明语法data.table?