【问题标题】:R - Collapsing rows to closest date when NAR - NA 时将行折叠到最接近的日期
【发布时间】:2018-05-12 04:31:15
【问题描述】:

假设我有这个数据框:

Date        A   B
2010-01-01  NA  1
2010-01-02  2   NA
2010-01-05  3   NA
2010-01-07  NA  4
2010-01-20  5   NA
2010-01-25  6   7

我想折叠行,将 NA 值删除到最接近的日期。所以结果是:

Date        A  B
2010-01-02  2  1
2010-01-07  3  4
2010-01-20  5  NA
2010-01-25  6  7

我看到this 堆栈溢出解决了使用键值折叠的问题,但我找不到使用关闭日期值折叠的类似情况。

Obs1:如果日期相距太远(例如:相隔超过 15 天),如果有办法不折叠行,那就太好了。

Obs2:如果折叠线保留较晚的日期而不是较早的日期会很好,如上例所示。

【问题讨论】:

  • 您是否希望折叠超过 2 行?
  • 只在有 NA 的地方折叠(所以在上面的例子中答案是否定的)。如果有更多列,则可能会折叠超过 2 行。
  • 是的。我在考虑类似的路线,在解决方案中我试图崩溃,直到 A 和 B 都得到 non-NA 值。

标签: r dplyr


【解决方案1】:

使用dplyr 包,一个选项可以是group_by 组合A 和B,使它们形成完整的值。

考虑到 Obs#2 应将 Date 的 max 用于组合行。

library(dplyr)
library(lubridate)
df %>% mutate(Date = ymd(Date)) %>%
  mutate(GrpA = cumsum(!is.na(A)), GrpB = cumsum(!is.na(B))) %>%
  rowwise() %>%
  mutate(Grp = max(GrpA, GrpB)) %>%
  ungroup() %>%
  select(-GrpA, -GrpB) %>%
  group_by(Grp) %>%
  summarise(Date = max(Date), A = A[!is.na(A)][1], B = B[!is.na(B)][1])

# # A tibble: 4 x 4
# Grp Date           A     B
# <int> <date>     <int> <int>
# 1     1 2010-01-02     2     1
# 2     2 2010-01-07     3     4
# 3     3 2010-01-20     5    NA
# 4     4 2010-01-25     6     7

数据:

df <- read.table(text = 
"Date        A   B
2010-01-01  NA  1
2010-01-02  2   NA
2010-01-05  3   NA
2010-01-07  NA  4
2010-01-20  5   NA
2010-01-25  6   7",
stringsAsFactors = FALSE, header = TRUE)

【讨论】:

  • 这不起作用。例如,使用以下 df,B = 5 的行将消失: df
  • @Daniel 是的。它不考虑这种情况。让我重温一遍。
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2012-04-22
  • 1970-01-01
  • 2021-07-21
  • 2022-10-05
  • 2021-10-09
相关资源
最近更新 更多