在R数据框中根据条件查找特定日期

时间:2018-06-22 14:17:31

标签: 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    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

投放:

structure(list(Unique_ID = c("JJ-123", "JJ-113", "JJ-457", "JJ-879"
), D_1 = c("01/04/2018", "01/04/2018", "03/04/2018", "01/04/2018"
), ST_1 = c("No Range", "50-80", "10-30", "No Range"), D_2 = c("12/03/2018", 
"05/03/2018", "12/03/2018", "12/03/2018"), ST_2 = c("50-80", 
"50-80", "1-5", "50-80"), D_3 = c("01/02/2018", "01/02/2018", 
"01/02/2018", "01/02/2018"), ST_3 = c("10-30", "10-30", "No Range", 
"50-80")), class = "data.frame", row.names = c(NA, -4L))

使用上面的数据框,当ST_值第一次更改为10-3050-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 

2 个答案:

答案 0 :(得分:2)

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 :(得分:0)

在我看来,您需要使用collect首先将此数据帧从宽转换为长。 1)您需要两个新列typeofif(typeof(ga) !== 'undefined'){ //typeof returns a string. This would be testing for google analytics on a page. 。 2)您需要两个新列St_NumberST_Value

做这两项(好吧,我想是4件事)将使您可以对想要的Date_Number值使用group_by并进行各种操作。

使用整洁的数据原理,您的生活将变得更加轻松。