R中的递减乘法

时间:2017-07-26 06:16:44

标签: 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_C,其中包含C递减系数0.1 的乘积。
必须仅对10 C_C的{​​{1}}个值进行乘法,其中C0之外的值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 ,如果没有找到更多数据,则乘法将停止。

预期结果

C

从所需结果中观察
1. 0中非ID = 2的值是ID == 3的enocunter,因此产品存储在C_C3C_C3 == C2 * 1。 2. C_C4 == C2*0.9C_C5 == C2 * 0.8C_C12 == C*0.1 ...... C_C13 == C2 *0,    C_C17 == C16 * 1
3.同样C_C18 == C16*0.9C_C19 == C16 *0.8C_C26 == C16 *0.1,...... C_C27 == C16*0,{{1}}

谢谢!

2 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:2)

来自基础R的sapply有点冗长的程序

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

在这里,我们首先找出不等于0(vals)的索引,得到它们各自的值(df$C[vals]),并且对于每个值,我们将它乘以1.0,0.9,0.8。 ...等等。我们现在拥有了我们需要的所有values,现在我们使用values函数来放置这些inds我们生成各自的索引(seq)。我们现在可以在各自的索引(values)处分配inds并将0分配给剩余值。