Как сделать парное сопоставление списков в R? - PullRequest
0 голосов
/ 08 марта 2019

Допустим, я работаю с набором данных iris и хочу найти индекс (или просто подмножество) каждого значения, имеющего определенный Sepal.Width и Petal.Length.

Desired_Width = c(3.5, 3.2, 3.6)
Desired_Length = c(1.4, 1.3, 1.4)

Я не хочу смешивать и сочетать, как если бы я сделал следующее:

Desired_index = which(iris$Sepal.Width %in% Desired_Width &
                      iris$Petal.Length %in% Desired_Length)

Я хочу только строки с ширинами Desired_Width [i] и длинами Desired_Length [i]

(строки 1, 3 и 5).

Я не хочу использовать цикл for, как бы я сделал это с помощью dplyr или 'which'?

Ответы [ 2 ]

3 голосов
/ 08 марта 2019

Одним из способов будет использование базы R mapply

mapply(function(x, y) which(iris$Sepal.Width == x & iris$Petal.Length == y),
                      Desired_Width, Desired_Length)


#     [,1] [,2] [,3]
#[1,]    1    3    5
#[2,]   18   43   38

Обратите внимание, что в выходных данных есть две строки, поскольку есть две записи, которые удовлетворяют условию.Например, для первого ввода мы можем проверить, что строки 1 и 18 имеют одинаковые значения Sepal.Width и Petal.Length.

iris[c(1, 18), ]
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1           5.1         3.5          1.4         0.2  setosa
#18          5.1         3.5          1.4         0.3  setosa

То же самое можно сделать, используя map2 из purrr

purrr::map2(Desired_Width, Desired_Length, 
    ~which(iris$Sepal.Width == .x & iris$Petal.Length == .y))


#[[1]]
#[1]  1 18

#[[2]]
#[1]  3 43

#[[3]]
#[1]  5 38
1 голос
/ 08 марта 2019

Другой путь от merge

mergedf=data.frame('Sepal.Length'=Desired_Length,'Sepal.Width'=Desired_Width)
yourdf=merge(iris,mergedf,by=c('Sepal.Width','Sepal.Length'),all.y =T)
...