让我们说一个图选择函数为我提供了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
预期结果是:
答案 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'))