我想从一个函数的列中返回多个结果data.frame
,并将这些新列data.frame
与其他简单计算一起添加到同一列中。
举一个简化的例子,如果我想同时获得积分值和sin
函数的绝对误差以及积分间隔的中点:
df <- data.frame(Lower = c(1,2,3), Upper = c(2,3,4))
setDT(df)
getIntegral <- function(l, u) {
n <- integrate(sin, mean(l), mean(u))
list(Value=n$value, Error=n$abs.error)
}
df[,
c('Value', 'Error', 'Mid') := {
n <- getIntegral(Lower, Upper)
list(n$Value,
n$Error,
(Lower+Upper)/2)
}]
df
Lower Upper Value Error Mid
1: 1 2 0.5738457 6.370967e-15 1.5
2: 2 3 0.5738457 6.370967e-15 2.5
3: 3 4 0.5738457 6.370967e-15 3.5
我不太喜欢我的方法,因为将新列的名称和分配给它们的值分隔开使我难以阅读,如何才能更好地完成此任务?它是长数据处理链的一部分,因此我不想在外部创建temp变量,因此我更喜欢使用data.table
或dplyr
单独使用的解决方案。
RHS应该是一个值列表,并且列表中的每个元素都将转换为一列(并在必要时回收)。
您的函数已经返回了list
(每个长度为1)并(Lower+Upper)/2
返回了3个值的向量(此处)。为了返回列表,可以使用c()
如下功能:
df[, c('Value', 'Error', 'Mid') := c(getIntegral(Lower, Upper), list((Lower+Upper)/2))]
# Lower Upper Value Error Mid
# 1: 1 2 0.5738457 6.370967e-15 1.5
# 2: 2 3 0.5738457 6.370967e-15 2.5
# 3: 3 4 0.5738457 6.370967e-15 3.5
这利用了c(list, list)
导致串联列表的事实。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句