【问题标题】:How to remove inconsistencies from dataframe (time series)如何从数据框(时间序列)中删除不一致
【发布时间】:2018-05-24 14:32:33
【问题描述】:

假设我们有这个数据框:

x<- as.data.frame(cbind(c("A","A","A","B","B","B","B","B","C","C","C","C","C","D","D","D","D","D"),
                        c(1,2,3,1,2,3,2,3,1,2,3,4,5,1,2,3,4,5),
                        c(10,12.5,15,2,3.4,5.7,8,9.5,1,5.6,8.9,10,11,2,3.4,6,8,10.5),
                        c(1,3,4,1,2,3,4,3,2,2,3,5,2,3,5,4,5,5)))
colnames(x)<- c("ID", "Visit", "Time", "State")

ID 列表示主题 ID。

Visit表示一系列访问

Time 列表示达到某个“状态”所经过的时间

State 列表示某种疾病的严重程度,其中 5 表示死亡。这意味着你可以从更差的状态波动到更好的状态,但你永远无法从第 5 类提升,因为你已经死了。

我只想确定那些从第 5 类提高到更好的主题,因为这些是数据帧中的错误(即第 13 行和第 16 行)。

此外,我想删除受试者似乎不止一次死亡的那些行(即第 18 行)。

我提出了类似的问题before,但它非常笼统,它暗示所有向更好状态的波动都已从数据集中删除,这不是我真正想要的。

【问题讨论】:

  • 这解决了您的问题吗?
  • 不,此代码不能解决问题。它突出了一个人第一次达到状态 5 并且没有跟随另一个 5。这不是我真正需要的。一旦受试者死亡(状态 = 5)(即第 13 和 16 行),我需要强调“不可能”的改进。就我而言,我的数据甚至没有排序,所以我也必须考虑变量“时间”。我需要的是一个没有第 13 行和第 16 行的 data.frame。
  • State=5(死亡)怎么可能跟在另一个State=5后面? ID=D 似乎发生了这种情况,根据您的解释,这表明同一主题死亡两次。更重要的是,您能否提供示例数据的预期输出?
  • 嗨@maurits-evers。你说的对。接受的代码解决了问题中最困难的部分,但我们仍然必须删除不止一次死亡的主题,比如你所说的主题 D。我没有解释问题的那一部分。对此感到抱歉。应该删除的实际行是 13、16 和 18。非常感谢!!!
  • 这已经被@Uwe 的回答解决了?

标签: r dataframe time-series aggregate


【解决方案1】:

修改问题的答案

OP 已通过要求将在第一次出现状态 5(死亡)之后出现的所有行视为错误,对问题进行了实质性修改。这包括错误恢复(如第 13 和 16 行)以及“重复死亡”(如第 17 和 18 行)。

要解决这个问题,需要一种完全不同的方法。一种可能性是使用非等连接

library(data.table)
setDT(x)[x[, first(Visit[State == 5]), by = ID], on = .(ID, Visit > V1), error := TRUE][]
    ID Visit Time State error
 1:  A     1 10.0     1    NA
 2:  A     2 12.5     3    NA
 3:  A     3 15.0     4    NA
 4:  B     1  2.0     1    NA
 5:  B     2  3.4     2    NA
 6:  B     3  5.7     3    NA
 7:  B     2  8.0     4    NA
 8:  B     3  9.5     3    NA
 9:  C     1  1.0     2    NA
10:  C     2  5.6     2    NA
11:  C     3  8.9     3    NA
12:  C     4 10.0     5    NA
13:  C     5 11.0     2  TRUE
14:  D     1  2.0     3    NA
15:  D     2  3.4     5    NA
16:  D     3  6.0     4  TRUE
17:  D     4  8.0     5  TRUE
18:  D     5 10.5     5  TRUE

第一次访问状态5的次数由

返回
x[, first(Visit[State == 5]), by = ID]
   ID V1
1:  C  4
2:  D  2

在随后的非等值连接中,仅标记出现在第一个状态 5 事件之后的那些行。

数据

x <- data.frame(
  ID = c("A","A","A","B","B","B","B","B","C","C","C","C","C","D","D","D","D","D"),
  Visit = c(1,2,3,1,2,3,2,3,1,2,3,4,5,1,2,3,4,5),
  Time = c(10,12.5,15,2,3.4,5.7,8,9.5,1,5.6,8.9,10,11,2,3.4,6,8,10.5),
  State = c(1,3,4,1,2,3,4,3,2,2,3,5,2,3,5,4,5,5))

【讨论】:

  • 亲爱的@uwe,非常感谢您的帮助。这个答案解决了这两个问题。很抱歉没有将附加要求添加为新帖子。最好的,亚特罗辛
【解决方案2】:

回答原问题

OP 已请求识别数据帧中的错误,其中状态 5 后跟每个 ID 的任何状态

answer of Hardik gupta 指向正确的方向,但未返回预期结果。因此,标记了第 12 行和第 15 行而不是第 13 行和第 16 行。此外,第 17 行设置了误报。

需要进行三个基本更改:(1) 使用 lag 而不是 lead 和 (2) 为 shift() 提供 fill 值:

library(data.table)
setDT(x)[, error := State < 5 & shift(State, fill = 0) == 5, by = ID][]
    ID Visit Time State error
 1:  A     1 10.0     1 FALSE
 2:  A     2 12.5     3 FALSE
 3:  A     3 15.0     4 FALSE
 4:  B     1  2.0     1 FALSE
 5:  B     2  3.4     2 FALSE
 6:  B     3  5.7     3 FALSE
 7:  B     2  8.0     4 FALSE
 8:  B     3  9.5     3 FALSE
 9:  C     1  1.0     2 FALSE
10:  C     2  5.6     2 FALSE
11:  C     3  8.9     3 FALSE
12:  C     4 10.0     5 FALSE
13:  C     5 11.0     2  TRUE
14:  D     1  2.0     3 FALSE
15:  D     2  3.4     5 FALSE
16:  D     3  6.0     4  TRUE
17:  D     4  8.0     5 FALSE
18:  D     5 10.5     5 FALSE

数据

创建示例数据集需要进行第三次更改。

cbind() 返回一个矩阵,它将所有列转换为相同的类型,在这种情况下这是一个因素。因此,所有由数字组成的列都被视为因子。为了避免这种情况,需要将样本数据集定义为:

x <- data.frame(
  ID = c("A","A","A","B","B","B","B","B","C","C","C","C","C","D","D","D","D","D"),
  Visit = c(1,2,3,1,2,3,2,3,1,2,3,4,5,1,2,3,4,5),
  Time = c(10,12.5,15,2,3.4,5.7,8,9.5,1,5.6,8.9,10,11,2,3.4,6,8,10.5),
  State = c(1,3,4,1,2,3,4,3,2,2,3,5,2,3,5,4,5,5))

【讨论】:

  • 亲爱的@uwe。您的代码解决了我的大部分问题。我没有解释一个额外的问题。我还想删除受试者似乎不止一次死亡的那些行(即第 18 行)。很抱歉最初没有指定这一点。谢谢!!
【解决方案3】:

你可以像这样使用data.tableshift

library(data.table)
setDT(x)[, status := ((State == 5) & (shift(State,1,"lead") != 5)), by = ID]
x
   ID Visit Time State status
1:  A     1   10     1  FALSE
2:  A     2 12.5     3  FALSE
3:  A     3   15     4  FALSE
4:  B     1    2     1  FALSE
5:  B     2  3.4     2  FALSE
6:  B     3  5.7     3  FALSE
7:  B     2    8     4  FALSE
8:  B     3  9.5     3  FALSE
9:  C     1    1     2  FALSE
10:  C     2  5.6     2  FALSE
11:  C     3  8.9     3  FALSE
12:  C     4   10     5   TRUE
13:  C     5   11     2  FALSE
14:  D     1    2     3  FALSE
15:  D     2  3.4     5   TRUE
16:  D     3    6     4  FALSE
17:  D     4    8     5   TRUE
18:  D     5 10.5     5  FALSE

【讨论】:

    【解决方案4】:

    我仍然不清楚你想做什么。行 121517 不是错误的,应该删除吗?

    do.call(rbind.data.frame, lapply(tmp, function(w) {
        idx <- diff(w$State) <= 0 & w$State[-length(w$State)] == 5;
        w[!idx, ];
    }))
    #     ID Visit Time State
    #A.1   A     1   10     1
    #A.2   A     2 12.5     3
    #A.3   A     3   15     4
    #B.4   B     1    2     1
    #B.5   B     2  3.4     2
    #B.7   B     2    8     4
    #B.6   B     3  5.7     3
    #B.8   B     3  9.5     3
    #C.9   C     1    1     2
    #C.10  C     2  5.6     2
    #C.11  C     3  8.9     3
    #C.13  C     5   11     2
    #D.14  D     1    2     3
    #D.16  D     3    6     4
    #D.18  D     5 10.5     5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2013-05-12
      • 2018-08-18
      相关资源
      最近更新 更多