簡體   English   中英

R data.table用戶定義函數

[英]R data.table user defined function

我正在從在R中使用data.frame過渡到data.table,以獲得更好的性能。 轉換代碼的主要步驟之一是應用自定義功能,從在data.frame上應用到在data.table中使用它。

假設我有一個簡單的數據表dt1。

x y z---header

1 9 j

4 1 n

7 1 n

我試圖根據x,y,z的值計算dt1中的另一新列,我嘗試了兩種方法,兩種方法都能給出正確的結果,但是更快的方法會發出警告。 因此,在使用更快的版本轉換現有代碼之前,請確保警告沒有嚴重的意義。

(1) dt1[,a:={if((x<1) & (y>3) & (j == "n")){6} else {7}}]

(2) dt1[,a:={if((x<1) & (y>3) & (j == "n")){6} else {7}}, by = 1:nrow(x)]

版本1的運行速度比版本2快,但發出警告“條件的長度> 1,並且僅將使用第一個元素”,但結果很好。 第二個版本稍慢一些,但沒有發出警告。 我想確保一旦開始編寫復雜的函數,版本一就不會產生不穩定的結果。

請將該問題視為通用問題,以運行用戶定義的函數的視圖,該函數要訪問給定行中的不同列值並計算該行的新列值。

謝謝你的幫助。

如果“ x”,“ y”和“ z”是“ dt1”的列,請嘗試使用向量化ifelse

dt1[, a:=ifelse(x<1 & y >3 & z=='n', 6, 7)] 

或用7創建'a',然后根據邏輯索引將6分配給'a'。

dt1[, a := 7][x<1 & y >3 & z=='n', a:=6][]

使用功能

getnewvariable <- function(v1, v2, v3){
   ifelse(v1 <1 & v2 >3 & v3=='n', 6, 7)
}

 dt1[, a:=getnewvariable(x,y,z)][]

數據

df1 <- structure(list(x = c(0L, 1L, 4L, 7L, -2L), y = c(4L, 9L, 1L, 
1L, 5L), z = c("n", "j", "n", "n", "n")), .Names = c("x", "y", 
"z"), class = "data.frame", row.names = c(NA, -5L))

dt1 <- as.data.table(df1) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM