gpt4 book ai didi

R:在具有案例和观察值的数据框中计算从一个观察值到下一个观察值的变化

转载 作者:行者123 更新时间:2023-12-02 08:35:25 24 4
gpt4 key购买 nike

你好,我是 R 的新手,在完成本应相当简单的任务时遇到了困难。我确信有一个简单的解决方案,但我无法在网上找到它(包括在 StackOverflow 上)

我有一个包含CasesObservations 和变量Amount 的数据框。 Cases 是因素,observations 是整数,它们一起形成一个索引,使得包含 Case 的行 = 3 和 Observation = 4 对应于第 3 个案例的第 4 个观察值,包含 Case = 4 和 Observation = 1 的行对应于第 4 个案例的第一个观察值。

我正在尝试编写一个脚本来计算从每个案例中的一个观察到同一案例中的下一个观察的数量变化,然后将该差异存储在数据框中与第一个相关联的行的新列中这两个观察。因此,当我完成后,新列将包含从当前行观察到同一案例中下一个观察的数量变化。

数据框的形式是:

case <- c(1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4)
obs <- c(rep(1,6),rep(2,6),rep(3,4))
amount <- c(0,2,12,1,0,20,1,2,22,2,1,50,5,2,100,28)
d.example <- data.frame(case,obs,amount)
d.example$case <- as.factor(d.example$case)
case obs Amount 
1 1 0
2 1 2
3 1 12
4 1 1
5 1 0
6 1 20
1 2 1
2 2 2
3 2 22
4 2 2
5 2 1
6 2 50
1 3 5
2 3 2
3 3 100
4 3 28

注意:数据是不平衡的,每个案例可以有不同数量的观察值

结果应该是(现在我将 -1 放在 NA 中)

case obs Amount deltaAmount
1 1 0 1
2 1 2 0
3 1 12 10
4 1 1 1
5 1 0 1
6 1 20 30
1 2 1 4
2 2 2 0
3 2 22 78
4 2 2 26
5 2 1 -1
6 2 50 -1
1 3 5 -1
2 3 2 -1
3 3 100 -1
4 3 28 -1

我一直在尝试使用嵌套的 for 循环来做到这一点

deltaAmount <- NULL
deltaAmount <- rep(-1, length(d$Case))
d$deltaAmount <- deltaAmount

x <- NULL
y <- NULL


for( i in unique(d$Case)) { # i is the case index
x <- NULL
# set x equal to a vector containing all the observations for the ith case except the first observation
x <- subset( unique(d$Observation[which(d$Case == i)]), unique( d$Observation[which(d$Case == i)]) > 1)

for( j in x ) { # j is the observation index (starts at 2 to avoid the error that would occur if we subtract a preceeding obsevation from the first observation)

d$AmountRaised[which(d$Case == i) & which(d$Observation == j)] - d$AmountRaised[which(d$Case == i) & which(d$Observation == j-1)] -> y
y -> d$deltaAmount[which( d$Case == i & d$Observation == j-1 )]

}
}

当我运行此命令时,该命令需要很长时间才能运行。当我终止程序时,它几乎就像陷入了无限循环(我还没有运行它直到完成)R 声明我有超过 50 条警告消息。它们都是这样的形式

1:其中(d$Case == i)& which(d$Observation == j):
较长的对象长度不是较短对象长度的倍数

但是创建了附加列,并且多个值已从 -1 更改为 0

我的数据框很大(770000 行)。

一旦我让它工作,我将需要做同样的事情,除了使用 difftime() 的日期。我意识到我可能会以错误的方式解决这个问题(即可能有更好的方法可以在不使用嵌套 for 循环的情况下执行此操作),但请记住,如果您建议我需要考虑日期集之间的差异不同的方法。

很抱歉问了这么长的问题,我希望我把一切都说清楚了。

提前感谢您的帮助。

最佳答案

假设数据按 obs 排序(很容易做到),这里是 base R 中的一个实现:

d.example$case.delta <- 
with(d.example, ave(amount, case, FUN=function(x) c(diff(x), NA)))

ave 函数按case 分解amount 向量,然后对每个组使用diff 功能(如您所见略有修改)。这会产生(为清楚起见按案例排序):

with(d.example, d.example[order(case, obs), ])
# case obs amount case.delta
# 1 1 1 0 1
# 7 1 2 1 4
# 13 1 3 5 NA
# 2 2 1 2 0
# 8 2 2 2 0
# 14 2 3 2 NA
# 3 3 1 12 10
# 9 3 2 22 78
# 15 3 3 100 NA
# 4 4 1 1 1
# 10 4 2 2 26
# 16 4 3 28 NA
# 5 5 1 0 1
# 11 5 2 1 NA
# 6 6 1 20 30
# 12 6 2 50 NA

关于R:在具有案例和观察值的数据框中计算从一个观察值到下一个观察值的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22084118/

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