R中的递减乘法

R中的递减乘法,r,dataframe,R,Dataframe,下面是我的示例数据帧df,有许多变量,其中C是变量中列的长度 ID C 1 0 2 1.47349678 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 16 1.987 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 我需要创建另一个变量C\u C,其中它由C的乘积和递减因子0.1组成 必须仅对C的10

下面是我的示例数据帧
df
,有许多变量,其中
C
是变量中列的长度

 ID C
 1  0
 2  1.47349678
 3  0
 4  0
 5  0
 6  0
 7  0
 8  0
 9  0
10  0
11  0
12  0
13  0
14  0
16  1.987
17  0
18  0
19  0
20  0
21  0
22  0
23  0
24  0
25  0
26  0
27  0
我需要创建另一个变量
C\u C
,其中它由
C
的乘积和递减因子0.1组成
必须仅对
C
10
值的计数进行乘法运算,从存在
C
值的点开始,而不是
0
。还必须从下一个数据点存储结果。i、 如果
C=0
位于
Id==2
处,则必须从
Id==3

如果在一个非零数之后,连续零少于
10
,则计数将重置为
C
的新值,如果没有找到进一步的数据,则乘法将停止

预期结果

   ID   C              C_C
   1    0              0
   2    1.47349678     0
   3    0              1.47349678
   4    0              1.326147102
   5    0              1.178797424
   6    0              1.031447746
   7    0              0.884098068
   8    0              0.73674839
   9    0              0.589398712
  10    0              0.442049034
  11    0              0.294699356
  12    0              0.147349678
  13    0              0
  14    0              0
  16    1.987          0
  17    0              1.987
  18    0              1.7883
  19    0              1.5896
  20    0              1.3909
  21    0              1.1922
  22    0              0.9935
  23    0              0.7948
  24    0              0.5961
  25    0              0.3974
  26    0              0.1987
  27    0               0
根据所需结果进行观察
1.
C
中不是
0
的值在
ID=2
处为enocunter,因此产品从
ID==3
存储,即
C_C3

2.
C_C3==C2*1
C_C4==C2*0.9
C_C5==C2*0.8
C_C12==C*0.1
C_C13==C2*0

3.类似地,
C_C17==C16*1
C_C18==C16*0.9
C_C19==C16*0.8
C_C26==C16*0.1
C_C27==C16*0

谢谢

使用dplyr:

library(dplyr)   
df$group = cumsum(dt$C>0)
df = df %>% group_by(group) %>% mutate(value=sum(C)) %>%
  mutate(n=1.1-0.1*(row_number()-1)) %>% mutate(n=ifelse(n<0|value==0|n==1.1,0,n)) %>%
  mutate(C_C = n*value) %>% ungroup() %>% select(-n,-group,-value) %>% as.data.frame()

   ID     C    C_C
1   1 0.000 0.0000
2   2 1.473 0.0000
3   3 0.000 1.4735
4   4 0.000 1.3261
5   5 0.000 1.1788
6   6 0.000 1.0314
7   7 0.000 0.8841
8   8 0.000 0.7367
9   9 0.000 0.5894
10 10 0.000 0.4420
11 11 0.000 0.2947
12 12 0.000 0.1473
13 13 0.000 0.0000
14 14 0.000 0.0000
15 16 1.987 0.0000
16 17 0.000 1.9870
17 18 0.000 1.7883
18 19 0.000 1.5896
19 20 0.000 1.3909
20 21 0.000 1.1922
21 22 0.000 0.9935
22 23 0.000 0.7948
23 24 0.000 0.5961
24 25 0.000 0.3974
25 26 0.000 0.1987
26 27 0.000 0.0000
库(dplyr)
df$group=cumsum(dt$C>0)
df=df%>%groupby(group)%>%mutate(value=sum(C))%>%
变异(n=1.1-0.1*(row_number()-1))%>%变异(n=ifelse(n%
将(C_C=n*value)%%>%ungroup()%%>%select(-n,-group,-value)%%>%as.data.frame()
身份证
1   1 0.000 0.0000
2   2 1.473 0.0000
3   3 0.000 1.4735
4   4 0.000 1.3261
5   5 0.000 1.1788
6   6 0.000 1.0314
7   7 0.000 0.8841
8   8 0.000 0.7367
9   9 0.000 0.5894
10 10 0.000 0.4420
11 11 0.000 0.2947
12 12 0.000 0.1473
13 13 0.000 0.0000
14 14 0.000 0.0000
15 16 1.987 0.0000
16 17 0.000 1.9870
17 18 0.000 1.7883
18 19 0.000 1.5896
19 20 0.000 1.3909
20 21 0.000 1.1922
21 22 0.000 0.9935
22 23 0.000 0.7948
23 24 0.000 0.5961
24 25 0.000 0.3974
25 26 0.000 0.1987
26 27 0.000 0.0000

一个有点长的过程,从基本R开始

vals <- which(df$C != 0)
values <- c(sapply(df$C[vals], function(x) x * rev(seq(0.1, 1.0, 0.1))))
inds <- c(sapply(vals + 1, function(x) seq(x, x+9)))
df$C_C <- 0
df$C_C[inds] <- values
df$C_C

# [1] 0.0000000 0.0000000 1.4734968 1.3261471 1.1787974 1.0314477 0.8840981
# [8] 0.7367484 0.5893987 0.4420490 0.2946994 0.1473497 0.0000000 0.0000000
#[15] 0.0000000 1.9870000 1.7883000 1.5896000 1.3909000 1.1922000 0.9935000
#[22] 0.7948000 0.5961000 0.3974000 0.1987000 0.0000000

vals如果在一个非零数之后有少于10个连续的零,那么计数会重置吗?@Ronaksah是的,我忘了提到那一点。计数应该重置新的
C
值以进行乘法。谢谢你的解决方案,但是
C_C3==C2*1
但是根据你的代码,它的
C_C3==C*0.9
。对不起,我看过头了通过将1设置为1.1tanks进行更正。效果非常好。很高兴我能提供帮助!感谢您的解决方案!!,我的数据帧大约是850K个数据点,您的代码是针对150K左右的数据点执行的,但是对于我的850K数据帧,它抛出了一个列长度不等的错误。