【发布时间】:2015-03-31 21:02:48
【问题描述】:
这是一个数据表
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 应用于“组”列定义的每个 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,因为我认为它最初过于简单化,并邀请了我试图解决的实际问题的变通方法。
【问题讨论】:
-
你的函数创建了不必要的副本,只需
dt[, .(x = seq(min(x), max(x) + 1), y = rep(y, each = 2)), by = group] -
或者,将您的函数定义为
myfunc <- function(x, y){ list(x = seq(min(x), max(x)+1), y = rep(y, each=2))},然后执行dt[, myfunc(x, y), by = group] -
@DavidArenburg 查看我的编辑(抱歉)
-
@Ben, @DavidArenburg 的评论仍然有效。让您的函数返回一个列表,而不是 data.table,然后执行
dt[, myfunc(x, y), by = group]。 -
其实你的新函数现在返回一个错误。
标签: r data.table