【问题标题】:How to make the last entry in a column within the same ID to be the first entry in R?如何使同一ID内的列中的最后一个条目成为R中的第一个条目?
【发布时间】:2021-11-25 22:27:27
【问题描述】:

我有一个超过 15000 行的数据集,看起来类似于:

  ID valid_from  valid_until     action  action_text
1  1 01/01/2010  31/01/2016      1       Text1
2  1 01/02/2016  01/01/2021      2       Text2
3  2 01/10/2010  30/09/2019      4       Text4
4  3 01/05/2015  31/12/2015      3       Text3
5  3 01/01/2016  30/09/2020      3       Text3

我想合并这些行,以便在同一 ID 内的列 valid_until 中的最后一个条目成为第一个条目。基本上,“valid_until”列中的第一个条目应该替换为 ID 中的最后一个条目,并且应该删除不是 ID 中第一个条目的行。

为了更清楚,我希望我的结果如下所示:

   ID  valid_from    valid_until     action  action_text
    1  1 01/01/2010  01/01/2021      1       Text1
    2  2 01/10/2010  30/09/2019      4       Text4
    3  3 01/05/2015  30/09/2020      3       Text3

有谁知道,我如何在 R 中做到这一点?

非常感谢您!

【问题讨论】:

  • 合并行时应该删除哪些 action 或 action_text 值?

标签: r duplicates data-cleaning


【解决方案1】:
library(dplyr)

df %>% group_by(ID) %>%
       mutate(valid_from=min(valid_from),
              valid_until=max(valid_until),
              action=first(action),
              action_text=first(action_text)) %>%
       distinct(across(everything()))
 

【讨论】:

  • 非常感谢,它解决了我的问题!
  • 很高兴我能帮上忙。如果您觉得答案有帮助,请考虑支持/接受
【解决方案2】:

我们可以将日期列转换为Date 类,并在执行distinct 之前更改“valid_until”列

library(dplyr)
library(lubridate)
df1 %>%
    mutate(across(starts_with('valid'), dmy)) %>% 
    group_by(ID) %>% 
    mutate(valid_until = max(valid_until)) %>% 
    ungroup %>%
    distinct(ID, .keep_all = TRUE) %>% 
    ungroup

-输出

# A tibble: 3 × 5
     ID valid_from valid_until action action_text
  <int> <date>     <date>       <int> <chr>      
1     1 2010-01-01 2021-01-01       1 Text1      
2     2 2010-10-01 2019-09-30       4 Text4      
3     3 2015-05-01 2020-09-30       3 Text3      

数据

df1 <- structure(list(ID = c(1L, 1L, 2L, 3L, 3L), valid_from = c("01/01/2010", 
"01/02/2016", "01/10/2010", "01/05/2015", "01/01/2016"), valid_until = c("31/01/2016", 
"01/01/2021", "30/09/2019", "31/12/2015", "30/09/2020"), action = c(1L, 
2L, 4L, 3L, 3L), action_text = c("Text1", "Text2", "Text4", "Text3", 
"Text3")), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5"))

【讨论】:

  • 非常感谢,效果很好!
  • 我使用了您建议的完全相同的代码,并且我刚刚意识到 valid_from 计算正确,但是 valid_until 总是返回整个列中的最后一个日期(在示例中为 01.01.2021)。你知道我可以如何帮助解决这个错误吗?
  • @Gabesz valid_until 也是使用`group_by. Is it possible that you loaded plyr` 库为每个 ID 计算的。尝试使用dplyr::mutate 而不仅仅是mutate 也许有来自plyr 的功能屏蔽
  • 太好了,使用 dplyr::mutate 成功了!非常感谢!
  • 只是加载多个包有时会在之后加载其他包时屏蔽掉其他包的功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多