如何一次计算多个变量和时间点的百分比变化?

时间:2017-08-07 12:08:42

标签: r dplyr linear-algebra matrix-multiplication

使用dplyr语法,我正在寻找一个优雅的"方法mutate新变量到给定数据框,包含不同时间点的百分比变化。

例如,请考虑以下data.frame包含在不同时间点(var.a,{{var.b取得的变量(var.cAB) 1}})。

set.seed(123)
df <- data.frame(replicate(6,sample(1:100,50,rep=TRUE)))
names(df) <- c("A.var.a", "A.var.b", "A.var.c", 
               "B.var.a", "B.var.b", "B.var.c")

如何计算每个变量的AB的百分比变化,以及mutate到数据框df的变化?我正在寻找dplyr或任何其他&#34; smart&#34;我可以在包含更多时间点和变量的更大数据框架中实现的解决方案,避免逐个输入包含所需输出的新变量。

1 个答案:

答案 0 :(得分:1)

你可以tidy然后聚合每一对。像

这样的东西

要将列添加到原始数据,您可以将library(tidyverse) df %>% tibble::rowid_to_column() %>% gather(key, value, -rowid) %>% separate(key, c("time", "var"), extra = "merge") %>% # split "A.var.a" into "A" & "var.a" arrange(rowid, var, time) %>% group_by(rowid, var) %>% summarise(diff = diff(value)/value[1]*100) %>% spread(var, diff) # # A tibble: 50 x 4 # # Groups: rowid [50] # rowid var.a var.b var.c # * <int> <dbl> <dbl> <dbl> # 1 1 193.103448 380.00000 -56.66667 # 2 2 -36.708861 115.55556 -32.35294 # 3 3 -4.878049 -23.75000 22.44898 # 4 4 -71.910112 300.00000 -71.87500 # 5 5 -87.368421 -28.07018 10.20408 # 6 6 680.000000 323.80952 -12.22222 # 7 7 9.433962 184.61538 -81.52174 # 8 8 -75.555556 -61.84211 -32.78689 # 9 9 -19.642857 -80.00000 14.28571 # 10 10 -52.173913 -52.63158 480.00000 # # ... with 40 more rows 添加到上述行。

或者在

的静脉中尝试逐行方法
%>% ungroup() %>% select(-rowid) %>% rename_all(~paste0("perc_", .x)) %>% bind_cols(df)

两者都需要一些调整......