【问题标题】:sum within groups when NANA 时在组内求和
【发布时间】:2017-06-29 19:47:37
【问题描述】:

我有 3 列(ID、日期、天数)的数据框。 X 列是我想要得到的。当有 NA 时,我想将上个月的天数与当月的天数相加。 dplyr可以做到吗?我试图用 for 循环来做,但它需要太多时间,因为我有超过 500 万行

  ID     date        days    X
  A     2014-01-31     NA   NA
  A     2014-02-28     NA   NA
  A     2014-03-31      4    4
  A     2014-04-30     NA   34
  A     2014-05-31     NA   65
  A     2014-06-30     NA   95
  A     2014-07-31     NA  126  
  B     2014-01-31     NA   NA
  B     2014-02-28     11   11
  B     2014-03-31      6    6
  B     2014-04-30     NA   36
  B     2014-05-31      6    6
  B     2014-06-30     NA   36
  C     2015-01-31     NA   NA
  C     2015-02-28     NA   NA

【问题讨论】:

  • 对不起...不清楚您想要实现的目标。例如,当您的 X 列中没有 NA 时,您希望实现什么?
  • 未给出“X”列。这是我想根据在“天”列上执行的计算得到的结果
  • 您能否展示您的代码,因为我不清楚

标签: r


【解决方案1】:

这里尝试使用tidyverse

library(tidyverse)

df %>% 
 mutate(date = as.Date(date, format = '%Y-%m-%d')) %>% 
 group_by(ID) %>% 
 mutate(new = cumsum(!is.na(days))+1) %>% 
 group_by(ID, new) %>% 
 mutate(new1 = cumsum(ifelse(is.na(days), as.numeric(diff.difftime(date)), days)), 
        new1 = replace(new1, new == 1, NA)) %>% 
 ungroup() %>% 
 select(-new)

# A tibble: 15 x 5
#       ID       date  days     X  new1
#   <fctr>     <date> <int> <int> <dbl>
# 1      A 2014-01-31    NA    NA    NA
# 2      A 2014-02-28    NA    NA    NA
# 3      A 2014-03-31     4     4     4
# 4      A 2014-04-30    NA    34    35
# 5      A 2014-05-31    NA    65    65
# 6      A 2014-06-30    NA    95    96
# 7      A 2014-07-31    NA   126   126
# 8      B 2014-01-31    NA    NA    NA
# 9      B 2014-02-28    11    11    11
#10      B 2014-03-31     6     6     6
#11      B 2014-04-30    NA    36    36
#12      B 2014-05-31     6     6     6
#13      B 2014-06-30    NA    36    36
#14      C 2015-01-31    NA    NA    NA
#15      C 2015-02-28    NA    NA    NA

【讨论】:

  • 感谢大家的回复。当一个 ID 的末尾和另一个 ID 的开头有 NA 时,就会出现一个问题。结果是错误的
  • @Koles,将其编辑到您的问题中。包括任何可能存在的极端案例,这样我们就不会过度拟合我们的答案
  • 我编辑了我的问题。我包括了两个 NA 和一个没有任何机器问题的案例。我想就是这样
  • 啊,好的,我现在看到了。我一吃完午饭回来就看看。没有食物,没有游戏:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多