Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从R数据帧查找条件上的特定日期_R_Dataframe_Dplyr_Tidyr - Fatal编程技术网

从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

我在下面提到了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    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))