R 根据截止年份添加元素和列?
给定以下数据帧。我想在表中添加4列。 一列用于在截止年之前添加元素中的数字,另一列用于在截止年之后添加元素中的数字 然后再添加两列,其中一列添加截止日期前的年/列总数,另一列添加截止日期后的年/列总数 各行中不应包括截止年份 因此,最终的表格将如下所示: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
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