Перекодировать и распределить данные в столбцах на основе значений в другом столбце - PullRequest
0 голосов
/ 03 июля 2018

У меня есть таблица, которая выглядит так:

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

и т.д ...

Столбцы 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 # и объединить их вместе. Но это немного запутанно, и мне было интересно, есть ли более простой способ сделать это?

Любая помощь высоко ценится.

Ответы [ 3 ]

0 голосов
/ 03 июля 2018
 dat1%>%
   gather(key,value,-Year)%>%
   group_by(key)%>%
   mutate(col=1:n())%>%
   ungroup()%>%
   mutate(key=paste0("Tax",2004:2008)[(Year==2005)+
         as.numeric(sub("\\D+","",key))])%>%
   spread(key,value)

# A tibble: 3 x 7
   Year   col Tax2004 Tax2005 Tax2006 Tax2007 Tax2008
  <int> <int>   <int>   <int>   <int>   <int>   <int>
1  2004     1      12     123     145     104      NA
2  2004     2     145      99      90      56      NA
3  2005     3      NA     212     300     240     123
> 
0 голосов
/ 03 июля 2018

Вот вариант с использованием data.table

library(data.table)
library(readr)
dcast(melt(setDT(df, keep.rownames = TRUE), id.var = c("rn", "Year"))[,
  newYear := paste0("Tax", Year + parse_number(variable) - 1)], 
     rn + Year~ newYear, value.var = 'value')[, rn := NULL][]
#    Year Tax2004 Tax2005 Tax2006 Tax2007 Tax2008
#1: 2004      12     123     145     104      NA
#2: 2004     145      99      90      56      NA
#3: 2005      NA     212     300     240     123
0 голосов
/ 03 июля 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...