如何将函数应用于 data.table 的行子集,其中每次调用 returns a 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 和 returns 上运行的函数 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
的 non-standard evaluation 功能并按如下方式定义您的函数
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
这是一个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 和 returns 上运行的函数 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
的 non-standard evaluation 功能并按如下方式定义您的函数
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