【问题标题】:Calculate increments of a variable in R计算 R 中变量的增量
【发布时间】:2012-11-12 16:20:32
【问题描述】:

我必须计算变量m 在时间间隔(t2-t1)内的增量。 这是我的数据框的虚拟版本:

df <- expand.grid(m = do.breaks(c(1, 10), 5),
                  sample = c("A", "B", "C", "D"))
df$t <- rep(1:6, 4, ordered = TRUE)
df$d_m <- NA

我要做的是用df$m[i+1]df$m[i] 之间的差异填充df$d_m[i], 这也必须在每个样本级别内完成。 所以这是我的尝试,但根本没有成功。

delta_m <- function(m, t){
               for(i in 1:length(t)){
               df$d_m[i] <- m[i+1] - m[i]
               }}

df <- ddply(df, .(sample, t), transform, d_m = delta_m(m, t))

我哪里错了?

【问题讨论】:

  • do.breaks 我相信来自 lattice。如果这是正确的,那么请将library(lattice) 添加到您的代码中,这样人们就不必自己弄清楚了。
  • 每个样本中 d_m 的最后一个值你想取什么值?
  • 无论如何,在m 中创建一组“中断”可能有更简单的方法。回到问题:df$d_m &lt;- diff(m) 不够吗?
  • 对不起,Dason,没有意识到 do.brakes 来自 lattice,最后一个 d_m 应该是 NA
  • Carl, diff() 很好,但我不能让它在 ddply 中工作。

标签: r function loops plyr


【解决方案1】:

sample拆分数据:

sdf <- split(df, df$sample)

然后应用一个函数diff()(在一个transform里面修改sdf的每个数据框组件里面的d_m。注意没有t == 0所以观察d_mNA

sdf <- lapply(sdf, function(x) transform(x, d_m = c(NA, diff(m))))

最后,将各个组件重新组合在一起

df <- do.call(rbind, sdf)

结果

> df
          m sample t d_m
A.A.1   1.0      A 1  NA
A.A.2   2.8      A 2 1.8
A.A.3   4.6      A 3 1.8
A.A.4   6.4      A 4 1.8
A.A.5   8.2      A 5 1.8
A.A.6  10.0      A 6 1.8
B.B.7   1.0      B 1  NA
B.B.8   2.8      B 2 1.8
B.B.9   4.6      B 3 1.8
B.B.10  6.4      B 4 1.8
B.B.11  8.2      B 5 1.8
B.B.12 10.0      B 6 1.8
C.C.13  1.0      C 1  NA
C.C.14  2.8      C 2 1.8
C.C.15  4.6      C 3 1.8
C.C.16  6.4      C 4 1.8
C.C.17  8.2      C 5 1.8
C.C.18 10.0      C 6 1.8
D.D.19  1.0      D 1  NA
D.D.20  2.8      D 2 1.8
D.D.21  4.6      D 3 1.8
D.D.22  6.4      D 4 1.8
D.D.23  8.2      D 5 1.8
D.D.24 10.0      D 6 1.8

【讨论】:

  • 效果很好,唯一的问题是现在必须做同样的事情,但是我需要它们的平均值而不是 m[i+1] 和 m[i] 之间的差异..
猜你喜欢
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 2020-10-30
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多