问题描述
id <- c(1,2,3,4,5)
week1 <- c(234,567456,134123,13412421,2345245)
week2 <- c(4234,5123456,454123,12342421,8394545)
week3 <- c(1234,234124,12348,9348522,134534)
data <- data.frame(id,week1,week2,week3)
我想找到第 1 周和第 2 周之间的百分比变化,然后是第 2 周和第 3 周等(我的数据框要大得多,大约有 27 列)。
我试过了:
data$change1 <- (data$week2-data$week1)*100/data$week1
但是,对于更大的数据集,这将是广泛的。
解决方法
尝试以下操作:
library(tidyverse)
df <- gather(df,key='week',value='value',-id)
df$week <- as.integer(as.character((gsub('week','',df$week))))
df %>% group_by(id) %>% arrange(week) %>% mutate(perc_change = (value-lag(value,1))/lag(value,1)*100)
# A tibble: 15 x 4
# Groups: id [5]
id week value perc_change
<dbl> <int> <dbl> <dbl>
1 1 1 234 NA
2 2 1 567456 NA
3 3 1 134123 NA
4 4 1 13412421 NA
5 5 1 2345245 NA
6 1 2 4234 1709.
7 2 2 5123456 803.
8 3 2 454123 239.
9 4 2 12342421 -7.98
10 5 2 8394545 258.
11 1 3 1234 -70.9
12 2 3 234124 -95.4
13 3 3 12348 -97.3
14 4 3 9348522 -24.3
15 5 3 134534 -98.4
这相当有效,但假设每周都有一次观察,否则您的百分比变化将基于最后可用的一周(因此,如果缺少第 3 周,则第 4 周的值将是第 1 周周变化以第 2 周为基础)。
(编辑:将 substr
替换为 gsub
)
感觉检查:
对于第 6 行,您会看到 id 1。这是第 2 周,值为 4234。在第 1 周,id 1 的值为 234。不同之处在于
(4234-234)/234
[1] 17.09402
所以,这是对齐的。