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