Re: [問題] data.table取出符合條件的資料

看板R_Language作者 (拒看低質媒體)時間10年前 (2014/04/03 23:51), 10年前編輯推噓2(204)
留言6則, 2人參與, 最新討論串2/4 (看更多)
幾種我知道的 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 快速 取出 : -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.162.249 ※ 文章網址: http://www.ptt.cc/bbs/R_Language/M.1396540286.A.8FC.html ※ 編輯: Wush978 (118.166.162.249), 04/03/2014 23:51:36

04/03 23:55, , 1F
說明一下, filter這方法來自dplyr套件(今年年初發佈的)
04/03 23:55, 1F

04/03 23:56, , 2F
然後它沒有使用data.table, 只有使用data.frame
04/03 23:56, 2F

04/04 00:04, , 3F
不好意思,就是我剛剛使用data.table用filter篩選結果和
04/04 00:04, 3F

04/04 00:04, , 4F
data.frame相同,這樣應該是可以適用在data.table格式嗎?
04/04 00:04, 4F

04/04 00:21, , 5F
可以
04/04 00:21, 5F
不好意思,上面推文的說明有點不清楚,在此澄清 上面測出來跑最快的filter是針對iris( data.frame ) 而dplyr套件本身都支援data.table。 ※ 編輯: Wush978 (118.166.162.249), 04/04/2014 00:22:47

04/04 01:22, , 6F
好的太感謝了!
04/04 01:22, 6F
文章代碼(AID): #1JFOD-Zy (R_Language)
文章代碼(AID): #1JFOD-Zy (R_Language)