首页 > 解决方案 > 根据另一列中的值重新编码和传播列中的数据

问题描述

我有一个看起来像这样的表:

Year   Tax1    Tax2    Tax3    Tax4
2004     12     123     145     104
2004    145      99      90      56
2005    212     300     240     123

ETC...

Tax# 列提供有关在 Year 列中的值之后的年份支付的税款的信息。我想重新排列表格,并重命名列,所以它看起来像这样:

Year   Tax2004    Tax2005    Tax2006    Tax2007    Tax2008
2004        12        123        145        104         NA
2004       145         99         90         56         NA 
2005        NA        212        300        240        123

我正在考虑根据年份列将表拆分为单独的表,然后重命名 Tax# 列,然后重新组合在一起。但这有点令人费解,我想知道是否有更简单的方法可以做到这一点?

非常感谢任何帮助。

标签: rdataframedplyr

解决方案


library(dplyr)
library(tidyr)

df <- read.table(text = "
Year   Tax1    Tax2    Tax3    Tax4
2004     12     123     145     104
2004    145      99      90      56
2005    212     300     240     123
", header = TRUE)


df %>% 
  mutate(id = row_number()) %>% 
  gather(rel_year, amount, contains("Tax")) %>% 
  mutate(rel_year = as.integer(gsub("Tax", "", rel_year)),
         pay_year = Year + rel_year - 1,
         pay_year = paste0("Tax", pay_year)) %>% 
  select(-rel_year) %>% 
  spread(pay_year, amount)

结果:

  Year id Tax2004 Tax2005 Tax2006 Tax2007 Tax2008
1 2004  1      12     123     145     104      NA
2 2004  2     145      99      90      56      NA
3 2005  3      NA     212     300     240     123

推荐阅读