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值之前的付款信息的方法.
任何帮助非常感谢,非常感谢提前.
(我知道这是一种奇怪的格式,希望将数据输入,但这就是我需要做的事情).
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)