查找唯一 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 R
、order
首先通过'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 的最早日期,然后将单独的因子设置为值的主要内容,如果未能解决你的问题,请参考以下文章