【发布时间】:2017-08-04 10:37:21
【问题描述】:
我正在尝试根据条件将该值与同一列的先前值相加。我的代码如下,但它需要永远运行。我应该如何优化它
df <- data.frame(a=rnorm(1:150000),
b=rnorm(1:150000))
df$d<-lag(df$b)
df$c<-0
for(row in 1:dim(df)[1]){df[row,]<-mutate(
df[1:row,],c=ifelse(df[1:row,2]==df[1:row,3],4,lag(c,1)+1))[row,]}
我已经尝试在具有以下代码的较小数据上执行此操作
df <- data.frame(a=c(1,2,4,3,1),
b=c(3,3,2,1,4))
df$d<-lag(df$b)
df$c<-0
输入:
> df
a b d c
1 1 3 NA 0
2 2 3 3 0
3 4 2 3 0
4 3 1 2 0
5 1 4 1 0
for(row in 1:dim(df)[1]){
df[row,]<-mutate(df[1:row,], c=ifelse(
df[1:row,2]==df[1:row,3],4,lag(c,1)+1))[row,]
}
输出如预期:
a b d c
1 3 NA NA
2 3 3 4
4 2 3 5
3 1 2 6
1 4 1 7
但是当我在 150000 行上运行时,它需要很长时间。需要优化一下
【问题讨论】:
-
mutate是dplyr实用程序吗?如果没有,您使用的是哪些软件包? -
当我测试它(在 1500 个样本上)时,所有这些都设置为
df$c到 NA 到处都是。 -
a b d c 1 3 NA NA 2 3 3 4 4 2 3 5 3 1 2 6 1 4 1 7
-
@spacedman 是的,我知道。那可能是因为我已经把它作为随机化的规范。但 a 和 b 不是范数。我已经更新了预期的输出。它需要自己滞后 c 列
-
你能解释一下你在用小数据示例做什么吗?例如,当 n 为 5 时。另外,如果你编辑你的帖子会更好,而不是写 cmets
标签: r performance for-loop