按值r过滤反向对dplyr

nbysray5  于 2023-03-27  发布在  其他
关注(0)|答案(3)|浏览(106)

我有一组两种顺序的对,例如A01-B 01,B 01-A01。但是我想只保留每个对的一个示例,基于另一列。

A = c("A01", "A01", "B01", "B02", "C03", "B01")
B = c("A02", "B01", "C03", "C03", "B01", "A01")
C = c(3, 4, 5, 2, 5, 3)
df <- tibble(A,B,C)
# A tibble: 6 × 3
  A     B         C
  <chr> <chr> <dbl>
1 A01   A02       3
2 A01   B01       4
3 B01   C03       5
4 B02   C03       2
5 C03   B01       5
6 B01   A01       3

我想保留C中具有较高值的对。在C中有平局的情况下,按字母顺序保留A列的行。
我想做的一部分

df <- df %>% 
  filter(A == B & B == A & C < C)

但这并不起作用,因为它卡在同一行上(我假设)。尝试使用%in%,但匹配得太松散。还没有完全将我的思想围绕rowwiseacross将如何解决这个问题。
我的预期输出是,并会更喜欢一个解决方案,使用dplyr管道,以适应与其余的我的分析,如果可能的话。

A     B         C
1 A01   A02       3
2 A01   B01       4
3 B01   C03       5
4 B02   C03       2
qyswt5oh

qyswt5oh1#

这里我定义了一个组,其中B 01-A01被放入A01-B 01组(任意按字母顺序表示这对),所以我们可以一起查看它们。pmin是一个矢量化的min,所以pmin(A,B)将为每行输出A和B中较小的值(按字母顺序)。

df %>%
  mutate(group = paste(pmin(A,B), pmax(A,B))) %>%
  slice_max(C, by = group, with_ties = FALSE) # "by" from dplyr v1.1.0

# otherwise use: group_by(group) %>% slice_max(C, with_ties = FALSE) %>% ungroup()

结果

# A tibble: 4 × 4
  A     B         C group  
  <chr> <chr> <dbl> <chr>  
1 A01   A02       3 A01 A02
2 A01   B01       4 A01 B01
3 B01   C03       5 B01 C03
4 B02   C03       2 B02 C03
mcvgt66p

mcvgt66p2#

我想这可以回答你的问题。

df %>% mutate(
    AB = ifelse(A>B, paste0(B, A), paste0(A, B))) %>% 
    group_by(AB) %>%
    filter(C==max(C)) %>% 
    summarise(across(A:C, first))
w8f9ii69

w8f9ii693#

试试这个

sort_and_paste <- function(str1, str2) {
    res <- paste(sort(c(str1, str2)), collapse="-")

    return(res)
}

df <- df %>%
    dplyr::mutate(AB_combined = mapply(sort_and_paste, A, B, SIMPLIFY=F)) %>%
    dplyr::group_by(AB_combined) %>%
    dplyr::slice_max(C) %>%
    dplyr::arrange(A) %>%
    dplyr::distinct(AB_combined, .keep_all = TRUE)

首先,我定义了一个函数来获取两个字符串,对它们进行排序,然后将它们粘贴在一起。这个函数的功能是使(A,B)==(B,A)。然后,按组合变量进行分组,并将具有最高值的行保留在C中。这仍然会返回重复项,因此我们可以按A排序并删除重复项。
结果

# A tibble: 4 × 4
  A     B         C AB_combined
  <chr> <chr> <dbl> <chr>      
1 A01   A02       3 A01-A02    
2 A01   B01       4 A01-B01    
3 B01   C03       5 B01-C03    
4 B02   C03       2 B02-C03

相关问题