如何在R中添加NA作为先前列的行?

时间:2018-03-20 21:52:59

标签: r sum lag shift

所有

我在第一列上有一个数据框,其中的日期和类别如下:

Accounts <- c('A','B','C','D',
          'A','B','C','D',
          'A','B','C','D')
Dates <- as.Date(c('2016-01-31', '2016-01-31','2016-01-31','2016-01-31',
               '2016-02-28','2016-02-28','2016-02-28','2016-02-28',
               '2016-03-31','2016-03-31','2016-03-31','2016-03-31'))
Balances <- c(100,NA,NA,NA,
          90,50,10,NA,
          80,40,5,120)
Origination <- data.frame(Dates,Accounts,Balances)

library(reshape2)
Origination <- dcast(Origination,Dates ~ Accounts, value.var = "Balances")

       Dates   A  B  C   D
1 2016-01-31 100 NA NA  NA
2 2016-02-28  90 50 10  NA
3 2016-03-31  80 40  5 120

目标是对先前值为NA的行求和。我试图使用滞后或移位,但没有把它拉下来的知识。

因此,对于这个数据帧,我希望最后的Totals列值为60(50 + 10),而2月和3月为120.

这可行吗?

此致 阿克塞尔

3 个答案:

答案 0 :(得分:3)

将选区向下移动一行,将所有非NA的过滤掉为0,然后使用rowSums

sel <- rbind(FALSE, !is.na(head(Origination[-1], -1)))
#sel
#         A     B     C     D
#[1,] FALSE FALSE FALSE FALSE
#[2,]  TRUE FALSE FALSE FALSE
#[3,]  TRUE  TRUE  TRUE FALSE

rowSums(replace(Origination[-1], sel, 0), na.rm=TRUE)
#[1] 100  60 120

如果您希望完全排除第一行,而不是完全包含,只需将FALSE更改为TRUE

sel <- rbind(TRUE, !is.na(head(Origination[-1], -1)))
rowSums(replace(Origination[-1], sel, 0), na.rm=TRUE)
#[1]   0  60 120

答案 1 :(得分:2)

thelatemail的解决方案看起来很棒。

但是,如果您想避免打印1月的总值,请尝试使用

Origination.matrix.select<-rbind(F,is.na(Origination[-1]))[-4,]
Total<-rowSums(as.matrix(Origination[,2:5])*Origination.matrix.select,na.rm=T)
Total
# [1] 0 60 120

答案 2 :(得分:1)

一种选择是继续链式reshape2::dcast并使用dplyr::mutate_at查找所需的输出。

  library(tidyverse)
  library(reshape2)
  Origination %>% 
    dcast(Dates~Accounts, value.var = "Balances" ) %>%
    mutate_at(vars(c("A","B","C","D")), 
          funs(ifelse(!is.na(lag(.)), NA, (.)))) %>%
    mutate(sum = rowSums(select(.,-Dates), na.rm = TRUE)) %>%
    select(Dates, sum)      
  # Dates         sum
  # 1 2016-01-31  100
  # 2 2016-02-28   60
  # 3 2016-03-31  120  

注意:如果row_number()==1的总和预计为ifelse,则mutate_at条件应添加到January的{​​{1}}部分。

数据

0