簡體   English   中英

如何將函數應用於data.table的行子集,其中每個調用返回data.table

[英]How do I apply a function to row subsets of a data.table where each call returns a data.table

這是一個data.table

dt <- data.table(group = c("a","a","a","b","b","b"), x = c(1,3,5,1,3,5), y= c(3,5,8,2,8,9))
dt
   group x y
1:     a 1 3
2:     a 3 5
3:     a 5 8
4:     b 1 2
5:     b 3 8
6:     b 5 9

這是一個在data.table上運行並返回data.table的函數

myfunc <- function(dt){
  # Hyman spline interpolation (which preserves monotonicity)

  newdt <- data.table(x = seq(min(dt$x), max(dt$x)))
  newdt$y <- spline(x = dt$x, y = dt$y, xout = newdt$x, method = "hyman")$y
  return(newdt)
}

如何將myfunc應用於“group”列定義的每個dt子集? 換句話說,我想要一種有效的,通用的方法來做到這一點

result <- rbind(myfunc(dt[group=="a"]), myfunc(dt[group=="b"]))
result
    x     y
 1: 1 3.000
 2: 2 3.875
 3: 3 5.000
 4: 4 6.375
 5: 5 8.000
 6: 1 2.000
 7: 2 5.688
 8: 3 8.000
 9: 4 8.875
10: 5 9.000

編輯:我已經更新了我的示例數據集和myfunc因為我認為它最初過於簡單化,並邀請解決我正在嘗試解決的實際問題。

data.table的整個想法是內存高效和快速。 因此,我們從不在data.table范圍內使用$ (僅在非常罕見的情況下),並且我們不在data.table的環境中創建data.table對象(當前,甚至.SD都有開銷)。

在您的情況下,您可以利用data.table非標准評估功能,並按如下方式定義您的功能

myfunc <- function(x, y){
   temp = seq(min(x), max(x))
   y = spline(x = x, y = y, xout = temp, method = "hyman")$y
   list(x = temp, y = y)
}

然后在dt范圍內的實現是直截了當的

dt[, myfunc(x, y), by = group]
#     group x      y
#  1:     a 1 3.0000
#  2:     a 2 3.8750
#  3:     a 3 5.0000
#  4:     a 4 6.3750
#  5:     a 5 8.0000
#  6:     b 1 2.0000
#  7:     b 2 5.6875
#  8:     b 3 8.0000
#  9:     b 4 8.8750
# 10:     b 5 9.0000

暫無
暫無

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

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