r-根据组为两个值之间的百分比变化创建变量



我想根据data.frameb(A,A;B,B;C,C(中的组来计算百分比差异。新变量rate应包含基于时间戳a(即3和7,而较小的数字总是前一个(的c的变化。当给定组只有一个时间戳时,它应该是NA

我试着使用常用的方法,但我总是得到一个零向量。示例数据:

a <- c(3,7,3,7,3,7,3,3,7,3,7,3,7,7)
b <- c("a", "a", "b", "b", "c", "c", "d", "e", "e", "f","f", "g", "g", "h")
c <- runif(14, min=80, max=100)
df <- data.frame(a,b,c)

我尝试了使用group_bymutatelag的常见方法,即

df %>% group_by(a,b) %>%
mutate(rate = 100 * (c - lag(c))/lag(c))

在使用lag之前,我也尝试过arrange,但得到的结果总是0。我认为这是因为没有时间序列,这就是为什么我们不能使用lag。必须有一种简单的方法通过使用常规函数来实现这一点。

如果您使用lag()来定义您的费率,您将得到"NA";对于每个b==3,并且当您分组"by"时b==7的正确值;b";。此外,c()是R中的基函数,最好不要使用"0";c";作为变量的名称。

这就是你想要的结果吗?

library(tidyverse)
a <- c(3,7,3,7,3,7,3,3,7,3,7,3,7,7)
b <- c("a", "a", "b", "b", "c", "c", "d", "e", "e", "f","f", "g", "g", "h")
d <- c(80, 100, runif(12, min=80, max=100))
df <- data.frame(a,b,d)
df %>% group_by(b) %>%
mutate(rate = 100 * (d - lag(d, default = NA))/lag(d, default = NA))
#> # A tibble: 14 × 4
#> # Groups:   b [8]
#>        a b         d   rate
#>    <dbl> <chr> <dbl>  <dbl>
#>  1     3 a      80    NA   
#>  2     7 a     100    25   
#>  3     3 b      88.0  NA   
#>  4     7 b      91.1   3.54
#>  5     3 c      95.1  NA   
#>  6     7 c      82.7 -13.1 
#>  7     3 d      92.6  NA   
#>  8     3 e      84.1  NA   
#>  9     7 e      91.8   9.20
#> 10     3 f      81.9  NA   
#> 11     7 f      93.6  14.4 
#> 12     3 g      88.7  NA   
#> 13     7 g      80.6  -9.11
#> 14     7 h      99.2  NA

创建于2021-12-20由reprex包(v2.0.1(

您也可以更灵活地使用ifelse(),例如,如果您希望在具有单个组的情况下使用NA,但在a==3:的情况下为零

library(tidyverse)
a <- c(3,7,3,7,3,7,3,3,7,3,7,3,7,7)
b <- c("a", "a", "b", "b", "c", "c", "d", "e", "e", "f","f", "g", "g", "h")
d <- c(80, 100, runif(12, min=80, max=100))
df <- data.frame(a,b,d)
df %>% group_by(b) %>%
mutate(group_number = n()) %>%
mutate(rate = ifelse(group_number == 1, NA, ifelse(a == 7, 100 * (d - lag(d, default = NA))/lag(d, default = NA), 0))) %>%
select(-group_number) %>%
ungroup()
#> # A tibble: 14 × 4
#>        a b         d   rate
#>    <dbl> <chr> <dbl>  <dbl>
#>  1     3 a      80     0   
#>  2     7 a     100    25   
#>  3     3 b      95.8   0   
#>  4     7 b      83.9 -12.5 
#>  5     3 c      87.0   0   
#>  6     7 c      81.5  -6.26
#>  7     3 d      97.0  NA   
#>  8     3 e      99.1   0   
#>  9     7 e      82.6 -16.6 
#> 10     3 f      82.3   0   
#> 11     7 f      96.0  16.7 
#> 12     3 g      99.5   0   
#> 13     7 g      93.4  -6.09
#> 14     7 h      86.8  NA

创建于2021-12-20由reprex包(v2.0.1(

最新更新