仅当另一个选定的列满足条件时,才如何比较两个单独的列的日期

丹妮尔(Danielle)

只是想知道是否有人可以帮助我解决这个令人沮丧的问题-不知道如何解决,因为它涉及很多问题。我是编码的新手,因此这个问题可能有一些不清楚的地方-如果有什么不对的地方,请告诉我!

我的数据的一个例子

#reproducible data (hopefully)

dat <-structure(list(id = 1:5, 
                     opstart = structure(c(1514970000, 1514904000, 1514916900, 1514883900, 1514979600), 
                                         class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
                     crdate_1 = structure(c(1514818380, 1514965080,1514752680, 1514760180, 1514919480), 
                                          class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
                      crdate_2 = structure(c(1515058680, 1515058740,1514817780, 1514965080, 1515064560), 
                                          class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
                     crdate_3 = structure(c(1515564000, 1515137700,  1514876100, NA, 1516101000), 
                                          class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
                      aki_1 = c("aki", NA, NA, NA, "aki"),
                      aki_2 = c("aki", NA, "aki", NA, "aki"), 
                     aki_3 = c("aki", "aki", "aki", NA, "aki")), 
                    row.names = c(NA, 5L), class = "data.frame")
id             opstart            crdate_1            crdate_2            crdate_3 aki_1 aki_2 aki_3
1  1 2018-01-03 09:00:00 2018-01-01 14:53:00 2018-01-04 09:38:00 2018-01-10 06:00:00   aki   aki   aki
2  2 2018-01-02 14:40:00 2018-01-03 07:38:00 2018-01-04 09:39:00 2018-01-05 07:35:00  <NA>  <NA>   aki
3  3 2018-01-02 18:15:00 2017-12-31 20:38:00 2018-01-01 14:43:00 2018-01-02 06:55:00  <NA>   aki   aki
4  4 2018-01-02 09:05:00 2017-12-31 22:43:00 2018-01-03 07:38:00                <NA>  <NA>  <NA>  <NA>
5  5 2018-01-03 11:40:00 2018-01-02 18:58:00 2018-01-04 11:16:00 2018-01-16 11:10:00   aki   aki   aki

我想做的是使用mutate创建一个名为aki_status的新列,该列将详细说明“ aki”是在opdate之前还是在opdate之后。crdate_1对应于aki_1,crdate_2对应于aki_2,依此类推。

复杂的是aki_status应该基于“ aki”首次出现的列。因此,例如,对于第一行,aki出现在aki_1中,因此在与opdate的比较中将使用crdate_1,但是在第三行中,aki首先出现在aki_2中,因此应在与opdate的比较中使用crdate_2。

理想的输出是

aki_status(preop, postop, preop, NA, postop)
乔恩·斯普林

这是一种方法,该方法依赖于首先将原始数据重塑为更易于使用的更长格式。此处的“ spec”表定义了我们希望将源数据中的列馈入哪一列(“ date”,“ aki”或“ obs”)。

library(tidyverse)
spec <- tribble(
  ~.name,    ~.value, ~obs,
  "crdate_1", "date", 1,
  "crdate_2", "date", 2,
  "crdate_3", "date", 3,
  "aki_1",    "aki",  1,
  "aki_2",    "aki",  2,
  "aki_3",    "aki",  3
)

dat_long <- pivot_longer_spec(dat, spec) 

该表更易于使用,因为它使我们可以直接比较每个crdate和其各自的opstart日期,同时跟踪它的回合日期。

#> dat_long
## A tibble: 15 x 5
#      id opstart               obs date                aki  
#   <int> <dttm>              <dbl> <dttm>              <chr>
# 1     1 2018-01-03 09:00:00     1 2018-01-01 14:53:00 aki  
# 2     1 2018-01-03 09:00:00     2 2018-01-04 09:38:00 aki  
# 3     1 2018-01-03 09:00:00     3 2018-01-10 06:00:00 aki  
# 4     2 2018-01-02 14:40:00     1 2018-01-03 07:38:00 NA   
# 5     2 2018-01-02 14:40:00     2 2018-01-04 09:39:00 NA   
# 6     2 2018-01-02 14:40:00     3 2018-01-05 07:35:00 aki  
# 7     3 2018-01-02 18:15:00     1 2017-12-31 20:38:00 NA   
# 8     3 2018-01-02 18:15:00     2 2018-01-01 14:43:00 aki  
# 9     3 2018-01-02 18:15:00     3 2018-01-02 06:55:00 aki  
#10     4 2018-01-02 09:05:00     1 2017-12-31 22:43:00 NA   
#11     4 2018-01-02 09:05:00     2 2018-01-03 07:38:00 NA   
#12     4 2018-01-02 09:05:00     3 NA                  NA   
#13     5 2018-01-03 11:40:00     1 2018-01-02 18:58:00 aki  
#14     5 2018-01-03 11:40:00     2 2018-01-04 11:16:00 aki  
#15     5 2018-01-03 11:40:00     3 2018-01-16 11:10:00 aki  

现在,我们可以查看每个“ id”中的第一个“ aki”,以获取每个“ id”的摘要状态“ aki_status”。

results <- dat_long %>%
  group_by(id) %>%
  filter(aki == "aki") %>%
  slice_min(date) %>%  # or slice_min(obs) -- same result always?
  mutate(aki_status = if_else(date < opstart, "preop", "postop"))

dat %>% left_join(results, by = c("id", "opstart"))

  id             opstart            crdate_1            crdate_2            crdate_3 aki_1 aki_2 aki_3 obs                date  aki aki_status
1  1 2018-01-03 09:00:00 2018-01-01 14:53:00 2018-01-04 09:38:00 2018-01-10 06:00:00   aki   aki   aki   1 2018-01-01 14:53:00  aki      preop
2  2 2018-01-02 14:40:00 2018-01-03 07:38:00 2018-01-04 09:39:00 2018-01-05 07:35:00  <NA>  <NA>   aki   3 2018-01-05 07:35:00  aki     postop
3  3 2018-01-02 18:15:00 2017-12-31 20:38:00 2018-01-01 14:43:00 2018-01-02 06:55:00  <NA>   aki   aki   2 2018-01-01 14:43:00  aki      preop
4  4 2018-01-02 09:05:00 2017-12-31 22:43:00 2018-01-03 07:38:00                <NA>  <NA>  <NA>  <NA>  NA                <NA> <NA>       <NA>
5  5 2018-01-03 11:40:00 2018-01-02 18:58:00 2018-01-04 11:16:00 2018-01-16 11:10:00   aki   aki   aki   1 2018-01-02 18:58:00  aki      preop

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

仅当另一个列值为True时比较两个或多个列值

如何从一个表中选择一个值,而在另一个表中满足两个单独的条件对

在熊猫中按行比较一个日期框架中的日期列值与另一个数据框架中的两个日期列

如何比较两个不同的csv文件中的列并替换另一个文件中的列

PySpark:当另一个列值满足条件时修改列值

当满足一个或另一个条件但不同时满足两个条件时,SQL选择

仅当满足另一列的条件时才填写

如何在Java中比较两个日期,然后将结果与另一个日期比较?

如何比较两个java sql日期,一个在列表中,另一个刚刚输入

比较两个文本两个文件,一个比较包含日期的列

仅当使用MySQL的一个表中的列值与另一表中的列值相同时,才如何从两个表返回数据?

仅当使用.NET匹配另一个单独的过滤器时,才如何执行RegEx替换?

从一个列返回两个条件的COUNT,从另一个列返回GROUP BY

如何在pyspark的另一列上过滤满足两个条件的ID?

如何在 Pandas 中将两列连接到另一个单独的列中?

如何在两个列上应用的条件下用另一个填充列

SQL如何根据另一个表中满足的条件显示列值

我该如何比较两个月的列并左移另一个,然后进行左联接?

当两个表引用另一个表中的单个列时如何设计表

创建一个新变量,仅当 R 中满足条件时才打印一系列列中的第一个值

仅当一列的所有元素都在另一个表中时才匹配

插入但仅当满足另一个表上的条件时

当行中满足两个条件时,从列中返回值的最后一个实例

将一个日期列与另一行中的另一个日期列进行比较

仅当值存在时,才通过vlookup另一个数据框替换列中的值

如何使用mysqli和php(仅使用查询)基于另一个列将两个表中的列连接和求和

在遍历另一个列表时比较两个列表-Python

我正在尝试根据日期和符号将另一个表的两个列乘以另一个表的多个值

如何仅删除满足 R 中另一个条件的重复项?