如何在dplyr中获取包含某些x / y值组合的所有行号

时间:2019-06-05 18:20:02

标签: r dplyr

让我们说一个图选择函数为我提供了x和y坐标(值)的数据框,我们可以使用以下方法人工生成:

newData <- mtcars[ c(1,3,5,9:11) ,c('mpg', 'cyl')]
rownames(newData) <- NULL
colnames(newData) <- c('x', 'y')

    x y
1 21.0 6
2 22.8 4
3 18.7 8
4 22.8 4
5 19.2 6
6 17.8 6

如何找出原始mtcars中的哪些行(即行号)包含这些x / y值组合?

我知道我可以加入两者,

inner_join(mtcars, newData[ ,c('x', 'y')], by = c("mpg" = "x", "cyl" = 'y'))

这给了我完整的数据帧,但是我只需要行号

我需要在此内部使用:

mtcars$selected <- T

mtcars %>%
 (selected = if_else(row_number() %in% '#ANSWER', !selected, selected))

以便从F <-> T

切换所有选定点

更新

我现在正在运行它:

mtcars %>%
    mutate(Selected = if_else(row_number() %in% {mtcars %>% 
            mutate(rn = row_number()) %>% 
            inner_join(distinct(newData), by = c('mpg' = "x", "cyl" = 'y')) %>% 
            pull(rn)}, !Selected, Selected))

为了将列名作为变量传递(例如,从R Shiny中的下拉菜单中获取),我们可以使用setNames(c('x', 'y'), c(xvar, yvar)))

xpar <- 'mpg' #(input$xpar_selector in shiny App)

ypar <- 'cyl' #(input$ypar_selector in shiny App)

mtcars %>%
  mutate(Selected = if_else(row_number() %in% {
      mtcars %>% 
        mutate(rn = row_number()) %>% 
        inner_join(distinct(newData), by = setNames(c('x', 'y'), c(xvar, yvar))) %>% 
        pull(rn)
       },
        !Selected, Selected))

How to pass column names for inner join by 2 column sets as variables with dplyr

预期结果是:

enter image description here

2 个答案:

答案 0 :(得分:1)

这是一个选项:

library(dplyr,warn.conflicts =  FALSE)
newData %>%
  distinct() %>%
  mutate(match = TRUE) %>%
  left_join(mtcars, by= c(mpg ="x", cyl="y"),.) %>%
  pull(match) %>%
  which()
#> [1]  1  2  3  5  9 10 11

答案 1 :(得分:1)

这是一种方法-

mtcars %>% 
  mutate(rn = row_number()) %>% 
  inner_join(distinct(newData), by = c("mpg" = "x", "cyl" = 'y')) %>% 
  pull(rn)

[1]  1  2  3  5  9 10 11

这是将其插入代码中的方法-

mtcars$selected <- TRUE

mtcars %>%
 mutate(selected = if_else(row_number() %in% {mtcars %>% 
  mutate(rn = row_number()) %>% 
  inner_join(distinct(newData), by = c("mpg" = "x", "cyl" = 'y')) %>% 
  pull(rn)}, !selected, selected))

这是获得结果的一种简单方法-

mtcars %>% 
  left_join(
    newData %>% 
      distinct() %>% 
      mutate(selected = FALSE),
    by = c("mpg" = "x", "cyl" = 'y')
  ) %>% 
  mutate(
    selected = if_else(is.na(selected), TRUE, selected)
  )

但是,我对您要在此处实现的目标感到困惑。 也许您只是在寻找anti_join,即从mtcars获取newData-

中不存在的行
mtcars %>% 
  anti_join(newData, by = c("mpg" = "x", "cyl" = 'y'))