现实生活中的问题:我有MRI扫描数据的科目.其中一些已被多次扫描(单独的行).其中一些每次都在不同的协议下进行扫描.我希望按主题ID保留所有唯一的行,如果主题是在两种不同的协议下扫描的,我希望它优先于另一种.
玩具示例:
library(dplyr)
df <- tibble(
id = c("A", "A", "B", "C", "C", "D"),
protocol = c("X", "Y", "X", "X", "X", "Y"),
date = c(seq(as.Date("2018-01-01"), as.Date("2018-01-06"),
by="days")),
var = 1:6)
Run Code Online (Sandbox Code Playgroud)
我想通过id返回包含所有唯一主题的数据框.当涉及到一个重复的值,而不是自动保留第一个条目时,我希望它保持条目以"Y"作为协议,如果它有这个选择,但不要除去带有"X"的行.
在该示例中,它将保留行2,3,4和6.
我更喜欢dplyr,但我愿意接受其他建议.
我尝试过的任何东西都没有开始工作:
df %>% distinct(id, .keep_all = TRUE) #Nope!
df %>% distinct(id, protocol == "Y", .keep_all = TRUE) #Nope!
df$protocol <- factor(df$protocol, levels = c("Y", "X"))
df %>% distinct(id, .keep_all = TRUE) #Nope!
df %>% group_by(id) %>% filter(protocol == "Y") #Nope!
Run Code Online (Sandbox Code Playgroud)
两个好的答案:@RobJensen建议
df %>% arrange(id, desc(protocol == 'Y')) …Run Code Online (Sandbox Code Playgroud)