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数据帧,它抛出了一个列长度不等的错误。