2017-08-07 72 views
0

使用dplyr語法,我正在尋找一個「優雅」的方式來mutate新變量到給定的數據幀,其中包含不同時間點的百分比變化。如何一次計算多個變量和時間點的百分比變化?

作爲一個例子,考慮以下data.frame包含變量(var.avar.bvar.c)在不同時間點(AB)服用。

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或其他任何可以在包含更多時間點和變量的較大數據框中實施的「智能」解決方案,從而避免逐個輸入包含所需輸出的新變量。

+1

我想我知道了解決方案,但給我請了幾個頂級行從輸出數據 – Adamm

回答

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)添加到上述行中。

或嘗試在

f <- function(x) { 
    as.list(diff(x, lag=3)/x[1:3]*100) 
} 
df %>% 
    rowwise %>% 
    do(data.frame(perc = f(unlist(.))) 
) %>% 
    bind_cols(df) 
# Source: local data frame [50 x 9] 
# Groups: <by row> 
# 
# # A tibble: 50 x 9 
# perc.B.var.a perc.B.var.b perc.B.var.c A.var.a A.var.b A.var.c B.var.a B.var.b B.var.c 
#   <dbl>  <dbl>  <dbl> <int> <int> <int> <int> <int> <int> 
# 1 193.103448 380.00000 -56.66667  29  5  60  85  24  26 
# 2 -36.708861 115.55556 -32.35294  79  45  34  50  97  23 
# 3 -4.878049 -23.75000  22.44898  41  80  49  39  61  60 
# 4 -71.910112 300.00000 -71.87500  89  13  96  25  52  27 
# 5 -87.368421 -28.07018  10.20408  95  57  49  12  41  54 
# 6 680.000000 323.80952 -12.22222  5  21  90  39  89  79 
# 7  9.433962 184.61538 -81.52174  53  13  92  58  37  17 
# 8 -75.555556 -61.84211 -32.78689  90  76  61  22  29  41 
# 9 -19.642857 -80.00000  14.28571  56  90  42  45  18  48 
# 10 -52.173913 -52.63158 480.00000  46  38  15  22  18  87 
# # ... with 40 more rows 

兩個靜脈一個橫行做法可能需要一些調整...

+0

在哪裏'rename_all'函數是從哪裏來的? 'dplyr'包? – AJMA

+0

@AJMA是的,它來自'dplyr'。 – lukeA