我想根据data.frame
的b
(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_by
、mutate
和lag
的常见方法,即
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(