首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取dplyr中包含某些x/y值组合的所有行号

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

Stack Overflow用户
提问于 2019-06-06 02:20:02
回答 2查看 68关注 0票数 2

假设一个绘图选择函数给了我一个x和y坐标(值)的数据框,我们可以用以下命令人工生成它:

代码语言:javascript
复制
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值组合?

我知道我可以加入他们两个,

代码语言:javascript
复制
inner_join(mtcars, newData[ ,c('x', 'y')], by = c("mpg" = "x", "cyl" = 'y'))

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

我需要在这个里面用到:

代码语言:javascript
复制
mtcars$selected <- T

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

为了从F< all >->>T切换所有选定点

更新

我现在运行这个:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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

预期结果为:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-06 02:43:29

这里有一种方法-

代码语言:javascript
复制
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

下面是如何在你的代码中插入这段代码-

代码语言:javascript
复制
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))

这里有一个更简单的方法来实现你的结果-

代码语言:javascript
复制
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中没有的行--

代码语言:javascript
复制
mtcars %>% 
  anti_join(newData, by = c("mpg" = "x", "cyl" = 'y'))
票数 1
EN

Stack Overflow用户

发布于 2019-06-06 02:27:20

这里有一个选项:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56466006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档