提问人:coreyeddy 提问时间:11/18/2023 最后编辑:Tugaycoreyeddy 更新时间:11/22/2023 访问量:45
我需要group_by然后dplyr::filter一个数据帧,以保留基于最小值和最大值的多行
I need to group_by then dplyr::filter a data frame to keep multiple rows based on min and max
问:
data1 <- data.frame(PIT = c(20111002, 20111002, 20111002, 20111002, 20111003, 20111003, 20111003, 20111003, 20111003, 20111003, 20111003, 20111003, 20111003, 20111003, 20111003, 20111003, 20111006, 20111006, 20111006, 20111006, 20111006) , rx = c(39, 42, 101, 109, 39, 42, 101, 109, 138, 138, 138, 136, 138, 138, 139, 139, 39, 39, 39, 39 , 42))
data2 <- data.frame(PIT = c(2011102, 2011102, 20111003, 20111003, 20111006, 20111006), rx = c(39, 109, 39, 138, 39, 42))
我需要从 .基本上,每个值有两个:1)第一个最小值和2)第一个最大值或第一个值>110。data2
data1
PIT
rx
rx
rx
我不认为我解释得很好,但我不知所措,不知所措,尝试了各种组合,匹配、第一、切片、最小、最大、过滤器,你能想到的,我已经尝试过了(显然除了解决方案)。另外,是的,我确实group_by并尝试了if_else。
我已经尝试了太多可能的解决方案,无法在此处包含。实际上,我只是花了 15 分钟尝试将代码发布到此消息中,但似乎无法正确格式化它?
答:
1赞
Mark
11/18/2023
#1
一句话:
dplyr::filter(data1, rx %in% c(min(rx), max(rx)) | rx >= 110, .by = PIT)
不确定您希望“rx 的第一个最大值或 rx 的第一个值 > 110”如何工作......但这得到了正确的答案。
评论
0赞
Friede
11/18/2023
错字。更改为 (+1)。data1
0赞
coreyeddy
11/20/2023
谢谢。这似乎几乎有效,但我为每个 PIT 获得多行,我只需要两行,第一个最小值和第一个最大值(或包含 136、138、139 的第一行)。我该如何服用第一个?我尝试过first(),match(),head(),但它们不起作用。
0赞
coreyeddy
11/22/2023
#2
看起来这有效。它可能不是最好或最精简的,但它有效。
min <- data1 %>%
group_by(PIT) %>%
dplyr::filter(rx==min(rx)) %>%
slice(1)
max1 <- data1 %>%
group_by(PIT) %>%
dplyr::filter(max(rx)<110 & rx == max(rx)) %>%
slice(1)
max2 <- data1 %>%
group_by(PIT) %>%
dplyr::filter(rx > 110) %>%
slice(1)
data2 <- dplyr::full_join(min, max1) %>%
dplyr::full_join(max2) %>% arrange(PIT,Presence)
评论