现实生活中的问题:我的受试者有 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)
我想返回一个包含所有唯一主题(按 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!
两个很好的答案:
@RobJensen 建议
df %>% arrange(id, desc(protocol == 'Y')) %>% distinct(id, .keep_all = TRUE)
如果我有多个协议并希望分配它们的选择顺序,我可以创建一个新变量,在其中按优先顺序为协议分配一个整数,然后使用 @joran 的建议
df %>% group_by(id) %>% arrange(desc(protocol),var) %>% slice(1)
Thanks!