查找唯一 ID 的最早日期,然后将单独的因子设置为值

Posted

技术标签:

【中文标题】查找唯一 ID 的最早日期,然后将单独的因子设置为值【英文标题】:Find earliest date for a unique ID then set separate factor to value 【发布时间】:2020-11-05 12:22:25 【问题描述】:

我需要确定每个唯一 ID (n=3127) 的最早日期并为其分配一个特定值 (30),但如果日期不是唯一 ID 的最早日期,那么我需要设置该值到另一个因素的。以下是数据:

Date     ID     Count
1/1/2020     1     -37
1/13/2020     1     12
2/1/2020     1     18
3/4/2020     2     470
3/24/2020     2     20
4/1/2020     2     6

最终数据框:

1/1/2020     1     30
1/13/2020     1     12
2/1/2020     1     18
3/4/2020     2     30
3/24/2020     2     20
4/1/2020     2     6

我有一些最初可以运行的代码,但出了点问题:

df$Temp1=c(NA,df$ID[2:nrow(df)-1])
df$Count=ifelse(df$ID==df$Temp1, Records3$Count, NA)
df$Count=ifelse((is.na(df$Count)==TRUE), 30, df$Count)

任何建议将不胜感激。干杯,道格

【问题讨论】:

ID 1 的最早日期是 2020 年 1 月 1 日,我猜您想将 Count 更改为 30。但是为什么3/4/2020也变了 抱歉,打错字了...我已经修改了 OP。 谢谢,我更新了帖子 【参考方案1】:

逻辑不清楚。或许,我们可以按 'ID' 和replace 第一个元素与 30 分组

library(dplyr)
library(lubridate)
df1 %>%
    mutate(Date = mdy(Date)) %>%
    arrange(ID, Date) %>% 
    group_by(ID) %>%
    mutate(Count = replace(Count, 1, 30)) %>% 
    ungroup
# A tibble: 6 x 3
#  Date          ID Count
#  <date>     <int> <dbl>
#1 2020-01-01     1    30
#2 2020-01-13     1    12
#3 2020-02-01     1    18
#4 2020-03-04     2    30
#5 2020-03-24     2    20
#6 2020-04-01     2     6

或者使用base Rorder首先通过'Date'和'ID'的数据,然后根据用duplicated创建的逻辑向量将'Count'中的值分配给30

df2 <- df1[order(df1$ID, as.Date(df1$Date, "%m/%d/%Y")),]
df2$Count[!duplicated(df1$ID)] <- 30

数据

df1 <- structure(list(Date = c("1/1/2020", "1/13/2020", "2/1/2020", 
"3/4/2020", "3/24/2020", "4/1/2020"), ID = c(1L, 1L, 1L, 2L, 
2L, 2L), Count = c(-37L, 12L, 18L, 470L, 20L, 6L)), class = "data.frame",
row.names = c(NA, 
-6L))

【讨论】:

akrun,你的第二个提案成功了。感谢您提供简短但甜蜜的解决方案。非常感谢。【参考方案2】:

您可以转换为Date 类,并且对于每个ID,最早将Count 更改为Date 到30。

library(dplyr)

df %>%
  mutate(Date = as.Date(Date, '%m/%d/%Y')) %>%
  group_by(ID) %>%
  mutate(Count = replace(Count, which.min(Date), 30))

#  Date          ID Count
#  <date>     <int> <dbl>
#1 2020-01-01     1    30
#2 2020-01-13     1    12
#3 2020-02-01     1    18
#4 2020-03-04     2    30
#5 2020-03-24     2    20
#6 2020-04-01     2     6

【讨论】:

以上是关于查找唯一 ID 的最早日期,然后将单独的因子设置为值的主要内容,如果未能解决你的问题,请参考以下文章

查找唯一标识符重复的每个字段的最大序列号

Oracle SQL 按日期查找唯一 ID

Redshift:在列表中查找 MAX 忽略非增量数字

Scala RDD按组获取最早日期

为每个唯一 ID 选择最近 30 个日期

如何返回最早日期的记录?