R按ID比较同一数据集中的行,以确定一行是否在一行之前
我试图编写一个代码,按Id对数据进行分组,并比较每个观察值,以确定列中的值是否在另一个值之后。如果一个以特定顺序出现在另一个之后,则观察结果将显示是或否 这是我的数据集:R按ID比较同一数据集中的行,以确定一行是否在一行之前,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我试图编写一个代码,按Id对数据进行分组,并比较每个观察值,以确定列中的值是否在另一个值之后。如果一个以特定顺序出现在另一个之后,则观察结果将显示是或否 这是我的数据集: ID Initial Review Type P40 Yes Meeting1 P40 Yes Meeting2 P42 Yes Meeting1 P42 Yes Meeting1 P43
ID Initial Review Type
P40 Yes Meeting1
P40 Yes Meeting2
P42 Yes Meeting1
P42 Yes Meeting1
P43 Yes Meeting1
P43 Yes Meeting2
P44 Yes Meeting1
P44 Yes Meeting1
这就是我想要实现的目标:
ID Outcome
P40 Yes
P42 No
P43 Yes
P44 No
这段代码不是我想要它做的。对不起,我是R的新手
tt %>% group_by(ID) %>% mutate(outcome = ifelse(Type == "Meeting1" & Type == "Meeting2", "Yes", "No")) %>% select(ID, outcome)
如果“Meeting1”和“Meeting2”是“类型”列中的唯一值,在按“ID”分组后,检查唯一元素的长度(
n_distinct
)是否等于2,如果是,则返回标志为“是”或“否”
tt %>%
group_by(ID) %>%
summarise(Outcome = c("No", "Yes")[(n_distinct(Type) == 2) + 1])
# A tibble: 4 x 2
# ID Outcome
# <chr> <chr>
#1 P40 Yes
#2 P42 No
#3 P43 Yes
#4 P44 No
数据
tt你在总结中的什么地方加了1?@NartRazak对不起,我是说2。更改了@akrun的措辞,很抱歉在这行中添加1:c(“否”、“是”)[所有(c(“调查”、“会议”)%在%EventType中)+1]@NartRazak没问题。注意%
或==
中的%的输出逻辑正确/错误。它将被编码为1/0。R中的索引从1开始。所以,如果我们把它改为2/1,那么我们就可以用一个向量来替换,其他值的顺序也是一样的。在这里,我们使用c(“No”,“Yes”)
,以便根据这里的值顺序,“Yes”替换2,“No”替换第一个
tt %>%
group_by(ID) %>%
summarise(Outcome = c("No", "Yes")[all(c("Meeting1", "Meeting2") %in% Type) + 1])
tt <- structure(list(ID = c("P40", "P40", "P42", "P42", "P43", "P43",
"P44", "P44"), Initial = c("Yes", "", "Yes", "Yes", "Yes", "",
"Yes", "Yes"), Review = c("", "Yes", "", "", "", "Yes", "", ""
), Type = c("Meeting1", "Meeting2", "Meeting1", "Meeting1", "Meeting1",
"Meeting2", "Meeting1", "Meeting1")),
class = "data.frame", row.names = c(NA,
-8L))