我试图通过计算每列的log-differences
来转换我的data.frame
并控制行id
。所以基本上我喜欢计算每个id变量的增长率。
所以这里是一个带有id列的随机df,一个时间段colum p和三个变量列:
df <- data.frame (id = c("a","a","a","c","c","d","d","d","d","d"),
p = c(1,2,3,1,2,1,2,3,4,5),
var1 = rnorm(10, 5),
var2 = rnorm(10, 5),
var3 = rnorm(10, 5)
)
df
id p var1 var2 var3
1 a 1 5.375797 4.110324 5.773473
2 a 2 4.574700 6.541862 6.116153
3 a 3 3.029428 4.931924 5.631847
4 c 1 5.375855 4.181034 5.756510
5 c 2 5.067131 6.053009 6.746442
6 d 1 3.846438 4.515268 6.920389
7 d 2 4.910792 5.525340 4.625942
8 d 3 6.410238 5.138040 7.404533
9 d 4 4.637469 3.522542 3.661668
10 d 5 5.519138 4.599829 5.566892
现在我已经编写了一个功能,它完全符合我的要求,但我不得不绕道而行,这可能是不必要的,可以删除。但是,不知怎的,我无法找到 捷径。 以下是发布数据框的功能和输出:
fct.logDiff <- function (df) {
df.log <- dlply (df, "code", function(x) data.frame (p = x$p, log(x[, -c(1,2)])))
list.nalog <- llply (df.log, function(x) data.frame (p = x$p, rbind(NA, sapply(x[,-1], diff))))
ldply (list.nalog, data.frame)
}
fct.logDiff(df)
id p var1 var2 var3
1 a 1 NA NA NA
2 a 2 -0.16136569 0.46472004 0.05765945
3 a 3 -0.41216720 -0.28249264 -0.08249587
4 c 1 NA NA NA
5 c 2 -0.05914281 0.36999681 0.15868378
6 d 1 NA NA NA
7 d 2 0.24428771 0.20188025 -0.40279188
8 d 3 0.26646102 -0.07267311 0.47041227
9 d 4 -0.32372771 -0.37748866 -0.70417351
10 d 5 0.17405309 0.26683625 0.41891802
问题是由于添加了NA
- 行。我不想折叠帧并减少它,这将由diff()
函数自动完成。所以我在原始帧中有10行,并且在转换后保持相同数量的行。为了保持相同的长度,我必须添加一些NAs
。我通过将data.frame转换为列表来绕道而行,将NAs
添加到每个id的第一行,然后将列表转换回data.frame。这看起来很单调乏味。
任何避免data.frame-list-data.frame类转换并优化函数的想法?
答案 0 :(得分:2)
这个怎么样?
nadiff <- function(x, ...) c(NA, diff(x, ...))
ddply(df, "code", colwise(nadiff, c("var1", "var2", "var3")))