小编Bar*_*art的帖子

R:如何根据另一个变量中的值选择dplyr :: distinct()保留哪一行?

现实生活中的问题:我有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)

r unique distinct-values dplyr

8
推荐指数
2
解决办法
2044
查看次数

标签 统计

distinct-values ×1

dplyr ×1

r ×1

unique ×1