将"实际年份"列更改为相对于另一列中的值的列

rw2*_*rw2 1 sql r data-manipulation dplyr data.table

我有一个如下所示的数据表:

ID    Start_Year    Payment_2010    Payment_2011    Payment_2012    Payment_2013
 1          2010              19              15              NA              11
 2          2012              22              24              26              23
 3          2012              NA              NA              NA              05   
 4          2011              17              NA              14              NA       
Run Code Online (Sandbox Code Playgroud)

对于许多行,它都是这样的,总共有大约20年的付款列.

我需要使用R或SQL重新定义它,当前的Payment列替换为第一列(Payment_1)表示Start_Year列中的值的列,并且列从那里开始依次进行.例如,我想让上面的表看起来像这样:

ID    Start_Year    Payment_1    Payment_2    Payment_3    Payment_4
 1          2010           19           15           NA           11
 2          2012           26           23           NA           NA
 3          2012           NA           05           NA           NA   
 4          2011           NA           14           NA           NA    
Run Code Online (Sandbox Code Playgroud)

因此,可以放弃在开始年份之前的第一个表中的任何付款信息.如果付款信息不可用,则该值应为NULL或NA(不为零,因为这些与我的数据中的NA不同).

我开始尝试使用动态SQL基于Start_year列创建新列,但是卡住了.我通过使用扩展和收集来自R中的dplyr包的命令更接近,但我的管道一直出错,我找不到丢弃start_year值之前的付款信息的方法.

任何帮助非常感谢,非常感谢提前.

(我知道这是一种奇怪的格式,希望将数据输入,但这就是我需要做的事情).

Ice*_*can 6

library(tidyverse)
library(data.table) # or reshape2

df %>% 
  melt(c('ID', 'Start_Year')) %>% 
  mutate(variable = as.numeric(gsub('Payment_', '', variable)) - Start_Year + 1) %>% 
  filter(variable >= 1) %>% 
  dcast(ID + Start_Year ~ variable) %>% 
  rename_at(vars(-ID, -Start_Year), ~paste0("Payment_", .)) #credit @avid_useR

#   ID Start_Year Payment_1 Payment_2 Payment_3 Payment_4
# 1  1       2010        19        15        NA        11
# 2  2       2012        26        23        NA        NA
# 3  3       2012        NA         5        NA        NA
# 4  4       2011        NA        14        NA        NA
Run Code Online (Sandbox Code Playgroud)

使用的数据:

structure(list(ID = 1:4, Start_Year = c(2010L, 2012L, 2012L, 
2011L), Payment_2010 = c(19L, 22L, NA, 17L), Payment_2011 = c(15L, 
24L, NA, NA), Payment_2012 = c(NA, 26L, NA, 14L), Payment_2013 = c(11L, 
23L, 5L, NA)), .Names = c("ID", "Start_Year", "Payment_2010", 
"Payment_2011", "Payment_2012", "Payment_2013"), row.names = c(NA, 
-4L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)