簡體   English   中英

使用mutate_at調用將R中的多個列划分

[英]Dividing across multiple columns in r using mutate_at call

我有一個看起來像這樣的數據框(讓我們稱之為每月平均)。

month_year       product_key_1      product_key_2        product_key_3        product_key_4
2014-08          NA                 NA                   NA                   50
2014-09          NA                 NA                   NA                   NA
2014-10          NA                 NA                   149                  NA
2014-11          NA                 40                   116.81               NA
2014-12          NA                 43                   117                  NA
2015-01          65                 NA                   117                  NA
2015-02          65                 NA                   300                  60
2015-03          65                 NA                   NA                   60
2015-04          NA                 NA                   NA                   70
2015-05          NA                 NA                   NA                   NA
2015-06          NA                 NA                   NA                   NA

但是我有數千行,還有幾個月。 我想做的是創建價格親戚,但要使用前一個月(而不是一月份的基准月)。 因此,以product_key_3為例,我將使用116.81 / 149作為2014-09的相對價格,並使用117 / 116.81作為2014-10的相對價格,以此類推。 如果我想要上一個單元格中的NA,或者在整個月中僅觀察到該產品的一個價格,我希望相對價格為(使用product_key_2),例如2014-11的價格為40/40。

我想要的輸出看起來像這樣:

          month_year       pr_product_1      pr_product_2        pr_product_3   pr_product_4

            2014-08          NA                 NA                   NA                 1
            2014-09          NA                 NA                   NA                 NA
            2014-10          NA                 NA                   1                  NA
            2014-11          NA                 1                    0.7839             NA
            2014-12          NA                 1.075                1.0016             NA
            2015-01          1                  NA                   1                  NA
            2015-02          1                  NA                   2.5641             1
            2015-03          1                  NA                   NA                 1
            2015-04          NA                 NA                   NA                 1.16
            2015-05          NA                 NA                   NA                 NA
            2015-06          NA                 NA                   NA                 NA

通過使用以下monthlyaveragestest <- monthlyaverages %>% mutate_at(.vars=vars(matches("product", ignore.case = FALSE)), .funs=funs(lag(lead(.)/.,)))我設法完成了上面解釋的操作: monthlyaveragestest <- monthlyaverages %>% mutate_at(.vars=vars(matches("product", ignore.case = FALSE)), .funs=funs(lag(lead(.)/.,)))

但是現在我想做類似的事情,但是要跨列而不是在行之間划分。 我知道可能有一個快速解決方案,但是我嘗試了此代碼的許多變體,但似乎無法使其正常工作,而且我找不到與我嘗試執行的操作類似的另一個問題。

任何幫助將不勝感激。 您可以使用以下方法重新創建示例數據集:

date <- c(2014-08, 2014-09, 2014-10, 2014-11, 2014-12, 2015-01, 2015-02, 2015-03, 2015-04, 2015-05, 2015-06)
product_key_1 <- c(NA, NA, NA, NA, NA, 65, 65, 65, NA, NA, NA)                    
product_key_2 <- c(NA, NA, NA, 40, 43, NA, NA, NA, NA, NA, NA)
product_key_3 <- c(NA, NA, 149, 116.81, 117, 117, 300, NA, NA, NA, NA)
product_key_4 <- c(50, NA, NA, NA, NA, NA, 60, 60, 70, NA, NA)
monthlyaverages <- data.frame(date, product_key_1, product_key_2, product_key_3, product_key_4)

請讓我知道所有這些是否有意義,以及是否可以使它更清晰。 謝謝。

我認為,如果將數據轉換為長格式,然后使用lag()划分列,則應該接近:

library(tidyverse)

monthlyaverages %>% 
    # turn it into long format
    gather(key, val, -month_year) %>%
    # insert a seperator to make it easier to split out the unique column name
    mutate(key = str_replace(key, "_(\\d+)", ";\\1") ) %>% 
    # split out the column name
    separate(key, c("key2", "type"), sep = ";") %>% 
    # sort by date, then by type
    group_by(month_year) %>%
    arrange(type) %>% 
    # divide the previous value by the current value, defaulting to 1 when val is NA
    # not sure exactly what you want--maybe you'll need to swap lag(val) and val
    mutate(  newval = lag(val)/coalesce(val,1)  ) %>% 
    ungroup() %>%
    # drop the unnecssary variables
    select(month_year, type, newval) %>% 
    # spread out the new variables
    spread(type, newval, sep = "div_")

稍后,您可以使用left_join()將其重新連接到monthlyaverages的每月平均值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM