【发布时间】:2018-08-26 02:12:15
【问题描述】:
我有一个非常大的数据集,可以用以下R 代码描述:
set.seed(1)
data <- data.frame(id = rep(c(rep(1,5), rep(2,5)),2), h = rep(1:2,10),
d = c(rep(1,10), rep(2,10)), t = rep(c(sample(c(1,2,3), 5, replace = T),
sample(c(1,2,3), 5, replace = T)),2), q = runif(20), p = runif(20),
b = runif(20), w = rep(c(rep(.1,2), rep(.2,2)),5))
其中id 是主题ID,h 和d 是小时和天。每个id 有多个t。对于t 的每种类型(可以是1、2 或3),由t_i 索引,在每个h 和d 中,我需要计算t = t_i 的总和q_i * pnorm((p_i - b_i)/ w_i) .理想情况下,输出应该是data.frame data 的附加列。
最快的计算方法是什么?我的数据集非常大,我担心for loop 或sapply 会花很长时间。我正在考虑使用aggregate 函数,但我不确定它是否适用于mean 或sum 以外的表达式。
---- 修正了 DGP 中的一个错字----
示例:给定数据 (set.seed(1)) 最后一列给出输出,而 Sum 给出乘以行的 q_i * pnorm((p_i - b_i)/ w_i)。第 1 行和第 4 行具有相同的条件变量,因此在 result 列中具有相同的值,因为这将等于 q_1 * pnorm((p_1 - b_1)/ w_1) +q_5 * pnorm((p_5 - b_5)/ w_5)``。如果我不清楚,我很抱歉。
id h d t q p b w Sum result
1.1 1 1 1 1 0.20597457 0.4820801 0.47761962 0.1 1.066513e-01 8.764928e-01
2.2 1 2 1 2 0.17655675 0.5995658 0.86120948 0.1 7.843788e-04 7.843788e-04
2.3 1 1 1 2 0.68702285 0.4935413 0.43809711 0.2 4.185307e-01 4.185307e-01
3.4 1 2 1 3 0.38410372 0.1862176 0.24479728 0.2 1.478031e-01 1.478031e-01
1.5 1 1 1 1 0.76984142 0.8273733 0.07067905 0.1 7.698414e-01 8.764928e-01
3.6 2 2 1 3 0.49769924 0.6684667 0.09946616 0.1 4.976992e-01 4.976992e-01
3.7 2 1 1 3 0.71761851 0.7942399 0.31627171 0.2 7.115705e-01 7.115705e-01
2.8 2 2 1 2 0.99190609 0.1079436 0.51863426 0.2 1.985233e-02 1.985233e-02
2.9 2 1 1 2 0.38003518 0.7237109 0.66200508 0.1 2.779585e-01 2.779585e-01
1.10 2 2 1 1 0.77744522 0.4112744 0.40683019 0.1 4.025021e-01 4.025021e-01
1.11 1 1 2 1 0.93470523 0.8209463 0.91287592 0.2 3.018017e-01 3.745763e-01
2.12 1 2 2 2 0.21214252 0.6470602 0.29360337 0.2 2.039559e-01 2.039559e-01
2.13 1 1 2 2 0.65167377 0.7829328 0.45906573 0.1 6.512825e-01 6.512825e-01
3.14 1 2 2 3 0.12555510 0.5530363 0.33239467 0.1 1.238378e-01 1.238378e-01
1.15 1 1 2 1 0.26722067 0.5297196 0.65087047 0.2 7.277459e-02 3.745763e-01
3.16 2 2 2 3 0.38611409 0.7893562 0.25801678 0.2 3.845907e-01 3.845907e-01
3.17 2 1 2 3 0.01339033 0.0233312 0.47854525 0.1 3.555325e-08 3.555325e-08
2.18 2 2 2 2 0.38238796 0.4772301 0.76631067 0.1 7.346728e-04 7.346728e-04
2.19 2 1 2 2 0.86969085 0.7323137 0.08424691 0.2 8.691717e-01 8.691717e-01
1.20 2 2 2 1 0.34034900 0.6927316 0.87532133 0.2 6.147884e-02 6.147884e-02
【问题讨论】:
-
aggregate适用于任何功能。您可以定义自己的命名函数,甚至使用匿名函数。 -
谢谢!但是如何写表达式?我必须汇总
t_i、q_i、p_i、b_i和w_i,对吗?