gpt4 book ai didi

R 数据帧 : Inter-row calculations

转载 作者:行者123 更新时间:2023-12-04 05:18:11 24 4
gpt4 key购买 nike

这是 Subtract previous year's from value from each grouped row in data frame 的扩展.使用 plyr 的选项完全有意义。

现在,我正在尝试添加更多列。我还修改了年份,因此它是一个实际的年份,具有不同的起点。这是制表符分隔的 df 的链接:https://dl.dropbox.com/u/9699533/df.txt

enter image description here

当我在当前行时,我无法获得指向前一行的指针。我想把它传递给 plyr::transform 的函数部分。请问这个怎么写?谢谢!

~~~~ 备用数据帧输入 ~~~~

> dput(df)
structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L,
4L, 4L, 5L, 5L, 5L), value = c(6L, 16L, 21L, 5L, 10L, 26L, 2L,
12L, 26L, 9L, 16L, 26L, 2L, 15L, 29L), year = c(2007L, 2008L,
2009L, 2011L, 2012L, 2013L, 2004L, 2004L, 2006L, 2010L, 2011L,
2012L, 2014L, 2015L, 2016L), actual = c(6L, 10L, 5L, 5L, 5L,
16L, 2L, 10L, 14L, 9L, 7L, 10L, 2L, 13L, 14L)), .Names = c("id",
"value", "year", "actual"), class = "data.frame", row.names = c(NA,
-15L))

最佳答案

不要使用 transform .

foo <- function(x){
x$ratio <- c(NA,tail(x$actual,-1)/head(x$value,-1))
x
}
>
> ddply(df,.(id),foo)
id value year actual ratio
1 1 6 2007 6 NA
2 1 16 2008 10 1.6666667
3 1 21 2009 5 0.3125000
4 2 5 2011 5 NA
5 2 10 2012 5 1.0000000
6 2 26 2013 16 1.6000000
7 3 2 2004 2 NA
8 3 12 2004 10 5.0000000
9 3 26 2006 14 1.1666667
10 4 9 2010 9 NA
11 4 16 2011 7 0.7777778
12 4 26 2012 10 0.6250000
13 5 2 2014 2 NA
14 5 15 2015 13 6.5000000
15 5 29 2016 14 0.9333333

如果我们可以假设您的数据框已排序,并且我们知道每个组有多大(通过 id ),我们甚至不需要执行整个拆分应用程序:
df$ratio2 <- with(df,c(NA,tail(actual,-1) / head(value,-1)))
df$ratio2[seq(1,nrow(df),by = 3)] <- NA

关于R 数据帧 : Inter-row calculations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13983956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com