Определите, какая строка data.frame точно соответствует вектору - PullRequest
0 голосов
/ 06 октября 2019

Учитывая данные data.frame:

var1 <- c(1, 2)
var2 <- c(3, 4)
var3 <- c(5, 6)
df <- expand.grid(var1 = var1, var2 = var2, var3 = var3)

  var1 var2 var3
1    1    3    5
2    2    3    5
3    1    4    5
4    2    4    5
5    1    3    6
6    2    3    6
7    1    4    6
8    2    4    6

Я хотел бы определить номер строки data.frame, соответствующий этому вектору (в данном случае ответ 4):

vec <- c(var1 = 2, var2 = 4, var3 = 5)

var1 var2 var3 
   2    4    5 

Я не могу разобраться с простым методом подмножества. Лучшее, что я смог придумать, это следующее:

working <- apply(df, 2, match, vec)
which(apply(working, 1, anyNA) == FALSE)

Это кажется менее простым, чем ожидалось;Мне было интересно, есть ли более простое решение?

Ответы [ 4 ]

2 голосов
/ 09 октября 2019

Для полноты подмножества могут быть реализованы с помощью data.table s join :

library(data.table)
setDT(df)[as.list(vec), on = names(vec), which = TRUE]
[1] 4
1 голос
/ 06 октября 2019

Мы можем транспонировать фрейм данных, сравнить его с vec и выбрать строку, в которой совпадают все значения.

which(colSums(t(df) == vec) == ncol(df))
#[1] 4
1 голос
/ 06 октября 2019

Вот опция dplyr:

library(dplyr)
library(magrittr)

df %>% mutate(new=paste0(var1,var2,var3), num=row_number()) %>% 
    filter(new=="245") %>% select(num) %>% as.integer()

[1] 4
1 голос
/ 06 октября 2019

Это можно решить с помощью библиотеки prodlim:

> library(prodlim)
> row.match(vec, df)
[1] 4
...