当输出行大小不同时,在同一data.frame中存储输出

时间:2012-07-05 12:29:38

标签: r

有时候我想对数据集执行一个函数(例如差异计算)并将结果直接存储在数据框中

df <- data.frame(a$C, diff(a$C))

但我不能这样做,因为行数不同。

是否有一些语法允许我这样做,当函数(NA)没有结果时可能有diff()

2 个答案:

答案 0 :(得分:3)

标准方法是创建一个在一端或另一端扩展的向量的NA

  dfrm$diffvec <- c(NA, diff(firstvec) )

答案 1 :(得分:3)

如果不对人们可能希望使用的整个功能进行大量假设,就没有一般的解决方案。

对于您展示的示例,我们可以轻松确定diff()中的第一个值如果返回则为NA

set.seed(5)
d <- rpois(10, 5)

> d
 [1] 3 6 8 4 2 6 5 7 9 2
> diff(d)
[1]  3  2 -4 -2  4 -1  2  2 -7

因此,如果您使用的是diff(),那么您可以随时执行:

> dd <- data.frame(d, Diff = c(NA, diff(d)))
> dd
   d Diff
1  3   NA
2  6    3
3  8    2
4  4   -4
5  2   -2
6  6    4
7  5   -1
8  7    2
9  9    2
10 2   -7

但现在考虑一下您可能希望使用的任何其他功能,并不总是在正确的位置返回NA

对于此示例,我们可以使用具有na.pad参数的 zoo 包:

require(zoo)
d2 <- as.zoo(d)
ddd <- data.frame(d, Diff = diff(d2, na.pad = TRUE))

> ddd
   d Diff
1  3   NA
2  6    3
3  8    2
4  4   -4
5  2   -2
6  6    4
7  5   -1
8  7    2
9  9    2
10 2   -7

如果您正在使用具有公式接口的建模函数(例如lm())并且该函数具有na.action参数,那么您可以在函数调用和提取函数中设置na.action = na.exclude例如fitted()resid()等将在正确的位置添加回输出NA,以便输出与传递给建模函数的数据长度相同。

如果您还想探索其他更具体的案例,请编辑您的答案。在特定情况下,通常会有一个简单的问答。在一般情况下答案是否定的,不可能按照你的要求做。