R 根据截止年份添加元素和列?

R 根据截止年份添加元素和列?,r,R,给定以下数据帧。我想在表中添加4列。 一列用于在截止年之前添加元素中的数字,另一列用于在截止年之后添加元素中的数字 然后再添加两列,其中一列添加截止日期前的年/列总数,另一列添加截止日期后的年/列总数 各行中不应包括截止年份 因此,最终的表格将如下所示: structure(list(`2005` = c(0L, 0L, 0L, 2L, 1L), `2006` = c(0L, 0L, 0L, 1L, 1L), `2007` = c(1L, 0L, 1L, 0L, 3L), `2008` = c

给定以下数据帧。我想在表中添加4列。 一列用于在截止年之前添加元素中的数字,另一列用于在截止年之后添加元素中的数字

然后再添加两列,其中一列添加截止日期前的年/列总数,另一列添加截止日期后的年/列总数

各行中不应包括截止年份

因此,最终的表格将如下所示:

structure(list(`2005` = c(0L, 0L, 0L, 2L, 1L), `2006` = c(0L, 
0L, 0L, 1L, 1L), `2007` = c(1L, 0L, 1L, 0L, 3L), `2008` = c(1L, 
0L, 0L, 4L, 3L), `2009` = c(1L, 0L, 0L, 2L, 3L), `2010` = c(0L, 
0L, 0L, 5L, 0L), `2011` = c(0L, 0L, 0L, 0L, 1L), `2012` = c(0L, 
0L, 0L, 4L, 1L), `2013` = c(1L, 0L, 1L, 0L, 0L), `2014` = c(0L, 
0L, 2L, 0L, 9L), `2015` = c(0L, 0L, 1L, 0L, 2L), `2016` = c(0L, 
0L, 0L, 0L, 0L), Cutoff = c("2011", "2015", "2015", "2005", "2011"
)), .Names = c("2005", "2006", "2007", "2008", "2009", "2010", 
"2011", "2012", "2013", "2014", "2015", "2016", "Cutoff"), row.names = c(NA, 
5L), class = "data.frame")

我发现,首先使用
melt
将表格整理成整齐的格式,然后使用一些data.table操作来统计年份数或截止年份前后的数字更容易

structure(list(`2005` = c(0L, 0L, 0L, 2L, 1L), `2006` = c(0L, 
0L, 0L, 1L, 1L), `2007` = c(1L, 0L, 1L, 0L, 3L), `2008` = c(1L, 
0L, 0L, 4L, 3L), `2009` = c(1L, 0L, 0L, 2L, 3L), `2010` = c(0L, 
0L, 0L, 5L, 0L), `2011` = c(0L, 0L, 0L, 0L, 1L), `2012` = c(0L, 
0L, 0L, 4L, 1L), `2013` = c(1L, 0L, 1L, 0L, 0L), `2014` = c(0L, 
0L, 2L, 0L, 9L), `2015` = c(0L, 0L, 1L, 0L, 2L), `2016` = c(0L, 
0L, 0L, 0L, 0L), Cutoff = c("2011", "2015", "2015", "2005", "2011"
), Numbers_Before = c(3, 0, 4, 0, 11), Numbers_After = c(1, 0, 
0, 16, 12), Years_Before = c(6, 10, 10, 0, 6), Years_After = c(5, 
1, 1, 11, 5)), .Names = c("2005", "2006", "2007", "2008", "2009", 
"2010", "2011", "2012", "2013", "2014", "2015", "2016", "Cutoff", 
"Numbers_Before", "Numbers_After", "Years_Before", "Years_After"
), row.names = c(NA, 5L), class = "data.frame")

以下是一种
dplyr
方法:

dt[, row := rownames(dt)]
dt2 = melt(dt, id.vars = c('Cutoff', 'row'), variable.name = 'Year', variable.factor = F)
dt2 = dt2[Year != Cutoff][, .(Numbers = sum(value), Years = .N), by = .(row, Year > Cutoff, Cutoff)]
dt2 = dcast(dt2, row + Cutoff ~ Year, value.var = c('Numbers', 'Years'), fill = 0)
dt = merge(dt, dt2, by = c('row', 'Cutoff'))

> dt
   row Cutoff 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 Numbers_FALSE
1:   1   2011    0    0    1    1    1    0    0    0    1    0    0    0             3
2:   2   2015    0    0    0    0    0    0    0    0    0    0    0    0             0
3:   3   2015    0    0    1    0    0    0    0    0    1    2    1    0             4
4:   4   2005    2    1    0    4    2    5    0    4    0    0    0    0             0
5:   5   2011    1    1    3    3    3    0    1    1    0    9    2    0            11
   Numbers_TRUE Years_FALSE Years_TRUE
1:            1           6          5
2:            0          10          1
3:            0          10          1
4:           16           0         11
5:           12           6          5
dt[, row := rownames(dt)]
dt2 = melt(dt, id.vars = c('Cutoff', 'row'), variable.name = 'Year', variable.factor = F)
dt2 = dt2[Year != Cutoff][, .(Numbers = sum(value), Years = .N), by = .(row, Year > Cutoff, Cutoff)]
dt2 = dcast(dt2, row + Cutoff ~ Year, value.var = c('Numbers', 'Years'), fill = 0)
dt = merge(dt, dt2, by = c('row', 'Cutoff'))

> dt
   row Cutoff 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 Numbers_FALSE
1:   1   2011    0    0    1    1    1    0    0    0    1    0    0    0             3
2:   2   2015    0    0    0    0    0    0    0    0    0    0    0    0             0
3:   3   2015    0    0    1    0    0    0    0    0    1    2    1    0             4
4:   4   2005    2    1    0    4    2    5    0    4    0    0    0    0             0
5:   5   2011    1    1    3    3    3    0    1    1    0    9    2    0            11
   Numbers_TRUE Years_FALSE Years_TRUE
1:            1           6          5
2:            0          10          1
3:            0          10          1
4:           16           0         11
5:           12           6          5
library(dplyr)
library(tidyr)

df1 %>%
  mutate(ID = row_number()) %>%
  gather(var, value, `2005`:`2016`) %>%
  group_by(ID) %>%
  mutate(Numbers_Before = sum(ifelse(var < Cutoff, value, 0)),
         Numbers_After = sum(ifelse(var > Cutoff, value, 0)),
         Years_Before = sum(ifelse(var < Cutoff, 1, 0)),
         Years_After = sum(ifelse(var > Cutoff, 1, 0))) %>%
  spread(var, value) %>%
  arrange(ID)
  Cutoff ID Numbers_Before Numbers_After Years_Before Years_After 2005 2006 2007 2008 2009 2010
1   2011  1              3             1            6           5    0    0    1    1    1    0
2   2015  2              0             0           10           1    0    0    0    0    0    0
3   2015  3              4             0           10           1    0    0    1    0    0    0
4   2005  4              0            16            0          11    2    1    0    4    2    5
5   2011  5             11            12            6           5    1    1    3    3    3    0
  2011 2012 2013 2014 2015 2016
1    0    0    1    0    0    0
2    0    0    0    0    0    0
3    0    0    1    2    1    0
4    0    4    0    0    0    0
5    1    1    0    9    2    0