簡體   English   中英

使用完成將月薪數據轉換為周薪並填寫 dplyr

[英]Convert monthly pay data to weekly using complete and fill in dplyr

我有關於工人工資的數據,一些工人按月支付,而另一些則按周支付。 我想按工人和周(一年)將數據組合成一個面板。 為此,我需要擴展每月行。

數據如下:

pay_data <- tibble(worker="Jim", start=ymd("2020-1-3"), end=ymd("2020-2-2"), rate=10, hours=50, wages=rate*hours) %>% 
  mutate(f_week=week(start), l_week=week(end))  

# A tibble: 1 x 8
  worker start      end         rate hours wages f_week l_week
  <chr>  <date>     <date>     <dbl> <dbl> <dbl>  <dbl>  <dbl>
1 Jim    2020-01-03 2020-02-02    10    50   500      1      5

有沒有辦法使用完整、填充或任何其他 dplyr function 來獲取如下所示的數據?

# A tibble: 5 x 5
  worker  week  rate hours  wage
  <chr>  <int> <dbl> <dbl> <dbl>
1 Jim        1    10    50   500
2 Jim        2    10    50   500
3 Jim        3    10    50   500
4 Jim        4    10    50   500
5 Jim        5    10    50   500

(然后,我當然會將這些金額分開,以將它們全部放在共同的單位中)。

謝謝!

使用tidyr::separate_rowstidyverse方法可能看起來像這樣。 為了使數據更有趣,我為第二個工作人員添加了數據。

library(tidyverse)

tbl %>% 
  rowwise() %>% 
  mutate(weeks = paste(seq(f_week, l_week, by = 1), collapse = ", ")) %>% 
  ungroup() %>% 
  separate_rows(weeks) %>% 
  select(-ends_with("_week"), -start, -end)
#> # A tibble: 13 x 5
#>    worker  rate hours wages weeks
#>    <chr>  <int> <int> <int> <chr>
#>  1 Jim       10    50   500 1    
#>  2 Jim       10    50   500 2    
#>  3 Jim       10    50   500 3    
#>  4 Jim       10    50   500 4    
#>  5 Jim       10    50   500 5    
#>  6 John      20   100  1000 1    
#>  7 John      20   100  1000 2    
#>  8 John      20   100  1000 3    
#>  9 John      20   100  1000 4    
#> 10 John      20   100  1000 5    
#> 11 John      20   100  1000 6    
#> 12 John      20   100  1000 7    
#> 13 John      20   100  1000 8

數據

tbl <- read.table(text="worker start      end         rate hours wages f_week l_week
1 Jim    2020-01-03 2020-02-02    10    50   500      1      5\n
2 John    2020-01-03 2020-02-02    20    100   1000      1      8", header = TRUE)
tbl
#>   worker      start        end rate hours wages f_week l_week
#> 1    Jim 2020-01-03 2020-02-02   10    50   500      1      5
#> 2   John 2020-01-03 2020-02-02   20   100  1000      1      8

另一種tidyverse方法是:

library(tidyverse)

pay_data %>%
  mutate(week = map2(f_week, l_week, seq)) %>%
  unnest(week) %>%
  select(worker, rate:wages, week)

#  worker  rate hours wages  week
#  <chr>  <dbl> <dbl> <dbl> <int>
#1 Jim       10    50   500     1
#2 Jim       10    50   500     2
#3 Jim       10    50   500     3
#4 Jim       10    50   500     4
#5 Jim       10    50   500     5

嘗試這個:

#Code
pay_data <- pay_data[rep(seq_len(nrow(pay_data)), unique(pay_data$l_week)),
         c('worker','rate','hours','wages')]
pay_data$week <- 1:nrow(pay_data)

Output:

# A tibble: 5 x 5
  worker  rate hours wages  week
  <chr>  <dbl> <dbl> <dbl> <int>
1 Jim       10    50   500     1
2 Jim       10    50   500     2
3 Jim       10    50   500     3
4 Jim       10    50   500     4
5 Jim       10    50   500     5

暫無
暫無

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

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