Существующая функция для просмотра, существует ли строка во фрейме данных? - PullRequest
11 голосов
/ 07 мая 2011

Существует ли существующая функция для определения, существует ли строка во фрейме данных? Полагаю, можно подать заявку / идентично, но, похоже, я что-то упустил.

Например:

с учетом такого фрейма данных:

  a   b
1 1 cat
2 2 dog

Существует ли существующая функция, которая позволит мне проверить, существует ли строка (1, cat) во фрейме данных?

Спасибо, Zach

Ответы [ 6 ]

18 голосов
/ 07 мая 2011

Попробуйте match_df из plyr (используя данные выборки Марека):

library(plyr)
X <- data.frame(a=1:2, b=c("cat","dog"))
row_to_find <- data.frame(a=1, b="cat")

match_df(X, row_to_find)
7 голосов
/ 07 мая 2011

Для данных ответа @Marek.

nrow(merge(row_to_find,X))>0 # TRUE if exists
7 голосов
/ 07 мая 2011

Если взять ваш пример:

X <- data.frame(a=1:2, b=c("cat","dog"))
row_to_find <- data.frame(a=1, b="cat") # it has to be data.frame (not a vector) to hold different types

Тогда

duplicated(rbind(X, row_to_find))[nrow(X)+1]

даст вам ответ.

1 голос
/ 26 марта 2017

Я предлагаю решение Бена Болкера , поскольку nrow(merge(row_to_find,X))>0 решение не работает для меня (всегда дают ИСТИНА):

tail(duplicated(rbind(X,row_to_find)),1)>0
0 голосов
/ 09 февраля 2018

Для поклонников dplyr и tidyverse вы можете использовать dplyr:anti_join().Согласно документации, dplyr::anti_join(x, y) "возвращает все строки из x, где в y нет совпадающих значений, сохраняя только столбцы из x."Следовательно, для dplyr::anti_join(row, df) результат имеет ноль строк, тогда row действительно был в df, если он имеет одну строку, то row не было в df.

library(dplyr)

df <- tribble(~a, ~b,
              1,  "cat",
              2,  "dog")
#> # A tibble: 2 x 2
#>       a b    
#>   <dbl> <chr>
#> 1  1.00 cat  
#> 2  2.00 dog

row <- tibble(a = 1, b = "cat")
#> # A tibble: 1 x 2
#>       a b    
#>   <dbl> <chr>
#> 1  1.00 cat

nrow(anti_join(row, df)) == 0  # row is in df so should be TRUE
#> Joining, by = c("a", "b")
#> [1] TRUE

row <- tibble(a = 3, b = "horse")
#> # A tibble: 1 x 2
#>       a b    
#>   <dbl> <chr>
#> 1  3.00 horse

nrow(anti_join(row, df)) == 0  # row is not in df so should be FALSE
#> Joining, by = c("a", "b")
#> [1] FALSE
0 голосов
/ 07 мая 2011

Для вектора y с тем же количеством элементов, что и столбцы в кадре данных, dfrm:

apply(dfrm, 1, function(x) all( x == y) )

Должен возвращать вектор TRUE и FALSE, который, в свою очередь, может использоваться как индекс в [,]

dfrm[ apply(dfrm, 1, function(x) all( x == y) ) , ]

Функция identical, вероятно, слишком строгая, поскольку она также проверяет атрибуты.

> y=c(1,2,3)
> x = data.frame(a=1:10, b=2:11, c=3:12)
> identical(x[1,] , y)
[1] FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...