根据数据集的行值应用规则

时间:2018-06-29 13:45:52

标签: r traminer

我是R语言的入门者,我已经开发了一些程序,但是我将向您展示的问题还没有发生在我身上。这是我正在处理的TSE数据框:

   ID TIME EVENT
1 150    1     A
2 150    2     B
3 150    2     C
4 150    2     D
5 151    1     C
6 151    2     A
7 151    3     B
8 151    3     D

此数据框包含3个变量:

ID:此人的ID

TIME:时间索引

事件:在特定时间发生的事件。

我想根据规则删除同时发生两个或多个事件的行(值(TIME))。假设规则是:C> B> A> D(其中“>”表示可取)

因此,在我的示例中,我只想保留这些行:

   ID TIME EVENT
1 150    1     A
3 150    2     C
5 151    1     C
6 151    2     A
7 151    3     B

您可以轻松地看到第2、4、8行由于已定义的规则而消失了

我想这对编程来说应该不是那么棘手,但是我真的不知道如何降低它。

谢谢大家的期待。

JérémieP.

1 个答案:

答案 0 :(得分:2)

这是使用dplyr的解决方案。

首先复制您的数据

DF <- data.frame(ID = rep(150:151, each=4), 
                 time=c(1, 2, 2, 2, 1, 2, 3, 3), 
                 EVENT=c("A", "B", "C", "D", "C", "A", "B", "D"))

target_rule <- c("C", "B", "A", "D")

然后,我们可以使用dplyr中的命令组合来订购,选择等。 在下面,我使用因子EVENT的版本根据您的标记规则对它们进行排序。

library("dplyr")
DF %>% 
  group_by(ID, time) %>%                               # Consider each combo of ID and time    
  mutate(fevent=factor(EVENT, levels=target_rule)) %>% # Create ordered version of EVENT 
  arrange(fevent) %>%                                  # Sort according to rule
  summarise(EVENT=first(EVENT)) %>%                    # Pick just the first 
  ungroup() %>% 
  arrange(ID) 

这产生

# A tibble: 5 x 5
     ID  time EVENT fevent    rn
  <int> <dbl> <fct> <fct>  <int>
1   150     1 A     A          1
2   150     2 C     C          1
3   151     1 C     C          1
4   151     2 A     A          1
5   151     3 B     B          1