从R数据帧查找条件上的特定日期
我在下面提到了R中的数据帧:从R数据帧查找条件上的特定日期,r,dataframe,dplyr,tidyr,R,Dataframe,Dplyr,Tidyr,我在下面提到了R中的数据帧: Unique_ID D_1 ST_1 D_2 ST_2 D_3 ST_3 JJ-123 2018-04-01 No Range 2018-03-12 50-80 2018-02-01 10-30 JJ-113 2018-04-01 50-80 2018-03-05 50-80 2018-02-01 10-30 JJ-457 201
Unique_ID D_1 ST_1 D_2 ST_2 D_3 ST_3
JJ-123 2018-04-01 No Range 2018-03-12 50-80 2018-02-01 10-30
JJ-113 2018-04-01 50-80 2018-03-05 50-80 2018-02-01 10-30
JJ-457 2018-04-03 10-30 2018-03-12 1-5 2018-02-01 No Range
JJ-879 2018-04-01 No Range 2018-03-12 50-80 2018-02-01 50-80
注意:为了简单起见,我只提到了三个ST_
值,尽管在原始数据帧中我有一个列,直到ST_38
Dput:
使用上面的数据框,我想得到最早的日期,当ST_uu
值第一次更改为10-30
和50-80
时
输出:
Unique_ID 10-30 50-80
JJ-123 2018-02-01 2018-03-12
JJ-113 2018-02-01 2018-03-05
JJ-457 2018-04-03 NA
JJ-879 NA 2018-02-01
在我看来,您首先需要使用gather将此数据帧从宽转换为长。 1) 您需要两个新列
St\u Number
和St\u Value
。
2) 您需要两个新列Date\u Number
和Date\u Value
做这两件事(好吧,我想是4件事)将允许您在唯一\u ID
值上使用group\u by并执行各种操作
使用整洁数据的原则,你的生活会轻松得多 在我看来,您首先需要使用gather将此数据帧从宽转换为长。
library(tidyr)
library(dplyr)
d %>% gather("variable", "value", -Unique_ID) %>%
separate(variable, c("variable", "number")) %>%
spread(variable, value) %>%
mutate(D = as.Date(D, format="%d/%m/%Y")) %>%
filter(ST %in% c("10-30", "50-80")) %>%
group_by(Unique_ID, ST) %>%
filter(D==min(D)) %>%
select(-number) %>%
spread(ST, D)
## # A tibble: 4 x 3
## # Groups: Unique_ID [4]
## Unique_ID `10-30` `50-80`
## * <chr> <date> <date>
## 1 JJ-113 2018-02-01 2018-03-05
## 2 JJ-123 2018-02-01 2018-03-12
## 3 JJ-457 2018-04-03 NA
## 4 JJ-879 NA 2018-02-01
1) 您需要两个新列St\u Number
和St\u Value
。
2) 您需要两个新列Date\u Number
和Date\u Value
做这两件事(好吧,我想是4件事)将允许您在唯一\u ID
值上使用group\u by并执行各种操作
使用整洁数据的原则,你的生活会轻松得多 library(tidyr)
library(tidyr)
library(dplyr)
d %>% gather("variable", "value", -Unique_ID) %>%
separate(variable, c("variable", "number")) %>%
spread(variable, value) %>%
mutate(D = as.Date(D, format="%d/%m/%Y")) %>%
filter(ST %in% c("10-30", "50-80")) %>%
group_by(Unique_ID, ST) %>%
filter(D==min(D)) %>%
select(-number) %>%
spread(ST, D)
## # A tibble: 4 x 3
## # Groups: Unique_ID [4]
## Unique_ID `10-30` `50-80`
## * <chr> <date> <date>
## 1 JJ-113 2018-02-01 2018-03-05
## 2 JJ-123 2018-02-01 2018-03-12
## 3 JJ-457 2018-04-03 NA
## 4 JJ-879 NA 2018-02-01
图书馆(dplyr)
d%%>%聚集(“变量”、“值”、-唯一ID)%%>%
单独(变量,c(“变量”,“数字”))%>%
价差(变量、值)%>%
变异(D=as.Date(D,format=“%D/%m/%Y”))%>%
过滤器(ST%在%c(“10-30”、“50-80”))%>%
分组依据(唯一ID,ST)%>%
过滤器(D==min(D))%>%
选择(-number)%%>%
排列(ST,D)
###tibble:4 x 3
###组:唯一的_ID[4]
##唯一的_ID`10-30``50-80`
## *
##1 JJ-113 2018-02-01 2018-03-05
##2 JJ-123 2018-02-01 2018-03-12
##3 JJ-457 2018-04-03 NA
##4 JJ-879 NA 2018-02-01
库(tidyr)
图书馆(dplyr)
d%%>%聚集(“变量”、“值”、-唯一ID)%%>%
单独(变量,c(“变量”,“数字”))%>%
价差(变量、值)%>%
变异(D=as.Date(D,format=“%D/%m/%Y”))%>%
过滤器(ST%在%c(“10-30”、“50-80”))%>%
分组依据(唯一ID,ST)%>%
过滤器(D==min(D))%>%
选择(-number)%%>%
排列(ST,D)
###tibble:4 x 3
###组:唯一的_ID[4]
##唯一的_ID`10-30``50-80`
## *
##1 JJ-113 2018-02-01 2018-03-05
##2 JJ-123 2018-02-01 2018-03-12
##3 JJ-457 2018-04-03 NA
##4 JJ-879 NA 2018-02-01
是的,但当状态更改为10-30
或50-80
时,我如何获得最早的日期或第一个日期。我将尝试过滤,通过管道输送到group_by,通过管道输送到Summary。您可能必须首先使用lubridate将日期值字段转换为实际日期时间,才能在摘要中使用min。@Jupiter,如果您包含一个我们可以读入R的数据样本,@BBlank和其他人将更能提供帮助。使用dput
;参考指南。@Aaron Dput样本:结构(列表(唯一ID=c(“JJ-123”、“JJ-113”、“JJ-457”、“JJ-879”)、D_1=c(“2018年4月1日”、“2018年4月1日”、“2018年4月3日”、“2018年4月3日”、“2018年4月1日”)、ST_1=c(“无范围”、“50-80”、“10-30”、“无范围”)、D_2=c(“2018年3月12日”、“2018年3月12日”、“2018年3月12日”)、ST_2=c(“50-80”、“50-80”、“1-50-80”),D_3=c(“2018年2月1日”,“2018年2月1日”,“2018年2月1日”,“2018年2月1日”),ST_3=c(“10-30”,“10-30”,“无范围”,“50-80”)),class=“data.frame”,row.names=c(NA,-4L))
是的,但当状态更改为10-30
或50-80
时,如何获取最早的日期或第一个日期。过滤器,通过,我会尝试将其导入总结。您可能必须首先使用lubridate将日期值字段转换为实际日期时间,才能在摘要中使用min。@Jupiter,如果您包含一个我们可以读入R的数据样本,@BBlank和其他人将更能提供帮助。使用dput
;参考指南。@Aaron Dput样本:结构(列表(唯一ID=c(“JJ-123”、“JJ-113”、“JJ-457”、“JJ-879”)、D_1=c(“2018年4月1日”、“2018年4月1日”、“2018年4月3日”、“2018年4月3日”、“2018年4月1日”)、ST_1=c(“无范围”、“50-80”、“10-30”、“无范围”)、D_2=c(“2018年3月12日”、“2018年3月12日”、“2018年3月12日”)、ST_2=c(“50-80”、“50-80”、“1-50-80”),D_3=c(“2018年2月1日”,“2018年2月1日”,“2018年2月1日”,“2018年2月1日”),ST_3=c(“10-30”,“10-30”,“无范围”,“50-80”)),class=“data.frame”,row.names=c(NA,-4L))