使用dplyr
语法,我正在寻找一个优雅的"方法mutate
新变量到给定数据框,包含不同时间点的百分比变化。
例如,请考虑以下data.frame
包含在不同时间点(var.a
,{{var.b
取得的变量(var.c
,A
,B
) 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")
如何计算每个变量的A
到B
的百分比变化,以及mutate
到数据框df
的变化?我正在寻找dplyr
或任何其他&#34; smart&#34;我可以在包含更多时间点和变量的更大数据框架中实现的解决方案,避免逐个输入包含所需输出的新变量。
答案 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)
两者都需要一些调整......