【问题标题】:Consider the consecutive value in the data考虑数据中的连续值
【发布时间】:2019-10-24 08:56:17
【问题描述】:

我有一个包含 3 列 ID、时间和类型的数据;我需要添加一个名为“categroy”的列,输出示例数据如下:

> dput(DF1)
structure(list(ID = c("104 - 2019-06-03", "104 - 2019-06-03", 
"104 - 2019-06-03", "104 - 2019-06-03", "104 - 2019-06-03", "104 - 2019-06-03", 
"104 - 2019-06-03", "104 - 2019-06-03", "104 - 2019-06-03", "104 - 2019-06-03", 
"104 - 2019-06-03", "111 - 2019-05-31", "111 - 2019-05-31"), 
    Time = c("11:17:01", "12:48:51", "13:54:09", "14:14:46", 
    "14:19:46", "14:32:46", "14:19:27", "14:35:12", "15:30:22", 
    "15:31:22", "16:29:12", "09:31:53", "09:31:56"), Type = c("IN", 
    "Out", "IN", "IN", "IN", "IN", "Out", "Out", "IN", "IN", 
    "Out", "IN", "Out"), Category = c("Include", "Include", "Include", 
    "Exclude", "Exclude", "Exclude", "Exclude", "Include", "Include", 
    "Exclude", "Include", "Include", "Include")), row.names = c(NA, 
-13L), class = c("tbl_df", "tbl", "data.frame"))

作为按时间和ID排序的滑动数据,需要考虑是否将人标记为“IN”然后“Out”使其成为一个正确的条目。如果按顺序发生,我将 IN 和 OUT 都标记为“包含”。有时,有多个连续的 IN 和 OUT 条目,在这些情况下,我将第一个“IN”标记为包含,将“最后一个“OUT”标记为包含。条目之间的中间标记为 exclude。谢谢!

【问题讨论】:

  • 也许您可以解释一下用于将条目分类为包含或排除的规则,并展示您已经尝试过的内容。

标签: r datatable dplyr


【解决方案1】:

正如沙特克在评论中告诉您的那样,您问题的主要挑战是要真正了解您的分类。由于我喜欢谜题,所以这是我的尝试。

据我了解,您希望每个 ID 交替输入和输出,按时间排序。

这是获取纳入标准的代码:

library(chron)
library(dplyr)

x = read.table(text = "
ID  Type  Time
104-2019-06-03  In  11:17:01
104-2019-06-03  Out 12:48:51
104-2019-06-03  In  13:54:09
104-2019-06-03  In  14:14:46
104-2019-06-03  Out 14:19:27
104-2019-06-03  In  14:31:12
104-2019-06-03  Out 15:21:51
104-2019-06-03  In  15:30:22
104-2019-06-03  Out 16:29:12
104-2019-06-04  In  14:31:12
104-2019-06-04  Out 15:21:51
104-2019-06-04  Out 15:30:22
104-2019-06-04  Out 16:29:12
", header=T) %>% 
  mutate(Time = chron(time=Time))

# x[c(4,11,12),"Category"] = "Exclude"
# x$Category = x$Category %>% replace_na("Include")

x %>% 
  arrange(ID, Time) %>% 
  group_by(ID) %>% 
  mutate(
    Category = ifelse(Type=="In", Type!=lag(Type), Type!=lead(Type)),
    Category = ifelse(is.na(Category)|Category==TRUE, "Include", "Exclude")
  )

这里的关键是使用laglead 来测试下一行/上一行是否具有相同的值。由于您想要最后一个或第一个,这取决于Type 的值。然后,您可以通过翻译为“包含”或“排除”来清理列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 2015-03-18
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多