下面是我的示例数据框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}}个值进行乘法,其中C
除0
之外的值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_C3
,C_C3 == C2 * 1
。
2. C_C4 == C2*0.9
,C_C5 == C2 * 0.8
,C_C12 == C*0.1
...... C_C13 == C2 *0
,
C_C17 == C16 * 1
。
3.同样C_C18 == C16*0.9
,C_C19 == C16 *0.8
,C_C26 == C16 *0.1
,...... C_C27 == C16*0
,{{1}}
谢谢!
答案 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分配给剩余值。