Re: [问题] data.table取出符合条件的资料

楼主: Wush978 (拒看低质媒体)   2014-04-03 23:51:16
几种我知道的 subsetting的方法比较:
```
tmp <- list()
for(i in 1:100) tmp[[i]] <- iris
iris <- do.call(rbind, tmp)
iris1 <- iris
library(data.table)
iris2 <- data.table(iris)
setkey(iris2, "Sepal.Width")
library(dplyr)
library(microbenchmark)
microbenchmark(
iris[iris$Sepal.Width == 3.5,],
subset(iris, Sepal.Width == 3.5),
iris2[J(3.5)],
filter(iris, Sepal.Width == 3.5),
filter(iris2, Sepal.Width == 3.5)
)
```
我自己应该会选用 `filter(iris, Sepal.Width == 3.5)` 这种,
在我电脑上的测试结果比其他的方法快3倍
※ 引述《tokyo291 (工口工口)》之铭言:
: [问题类型]:
:
: 效能咨询(我想让R 跑更快)
: 想在data.table格式中,取出一些特别的资料
: 由于循环数很大,想缩短取出的时间
:
: [软件熟悉度]:
: 使用者(已经有用R 做过不少作品)
: [问题叙述]:
: 在data.table格式的资料中,需要取出某行里数字相同的整列
: 目前有试过一些写法,不过时间都花蛮久的
: 有研究过data.table[] 中括号里面的写法,好像没有办法快速取出
: (在看package里面还有一个setkey指令,不晓得对快速取出有没有帮助)
: [程式范例]:
: 以下是我把我的问题简化的例子
: x<-structure(list(A = c(5, 3.5, 3.25, 4.25, 1.5), B = c(4.25, 4,
: 4, 4.5, 4.5), C = c(4.5, 2.5, 4, 2.25, 3)), .Names = c("A", "B",
: "C"), class = "data.frame", row.names = c(NA, -5L))
: x1<-as.data.table(x)
: > x1
: A B C
: 1: 5.00 4.25 4.50
: 2: 3.50 4.00 2.50
: 3: 3.25 4.00 4.00
: 4: 4.25 4.50 2.25
: 5: 1.50 4.50 3.00
: 第一种我使用
: > subset(x1,B==4)
: A B C
: 1: 3.50 4 2.5
: 2: 3.25 4 4.0
: 第二种是
: > x1[c(x1[,2,with=F]==4)]
: A B C
: 1: 3.50 4 2.5
: 2: 3.25 4 4.0
: 这两种都能达到我要的结果,但是时间却花很久
: 我完整的code是
: for(i in 1:nrow(a)){
: b_1=unique(subset(x,V2==a[i])[,4:5,with=F])
: b_2=unique(x[c(x[,2,with=F]==a[i])][,4:5,with=F])
: b_3=unique(x[a[i]][,4:5,with=F])
: }
: nrow(a)大约都是几万的数字
: x是要取出的资料
: a[i]则是在每个循环在第二行要取出符合的条件
: b_1和b_2是我自己写的结果对了但是时间要花很久
: b_3是之前试网络上的写法速度很快但是结果却是错误的
: 不晓得依照b_3这种类似的写法
: 能不能写出取出符合条件的列?
: [关键字]:
:
: data.table 快速 取出
:
楼主: Wush978 (拒看低质媒体)   2014-04-03 23:55:00
说明一下, filter这方法来自dplyr套件(今年年初发布的)然后它没有使用data.table, 只有使用data.frame
作者: tokyo291 (工口工口)   2014-04-04 00:04:00
不好意思,就是我刚刚使用data.table用filter筛选结果和data.frame相同,这样应该是可以适用在data.table格式吗?
楼主: Wush978 (拒看低质媒体)   2014-04-04 00:21:00
可以
作者: tokyo291 (工口工口)   2014-04-04 01:22:00
好的太感谢了!

Links booklink

Contact Us: admin [ a t ] ucptt.com