我是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.
答案 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