用于查看数据框中是否存在行的现有函数?

时间:2011-05-06 20:47:57

标签: r

是否存在用于确定数据帧中是否存在行的现有函数? 我想可以做一个申请/相同,但似乎我错过了一些东西。

例如:

给出这样的数据框:

  a   b
1 1 cat
2 2 dog

是否有现有的功能可以让我测试数据框中是否存在行(1, cat)

谢谢, 扎克

7 个答案:

答案 0 :(得分:18)

从plyr尝试match_df(使用Marek的样本数据):

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)

答案 1 :(得分:7)

举个例子:

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]

给你答案。

答案 2 :(得分:7)

来自@Marek的数据回答。

nrow(merge(row_to_find,X))>0 # TRUE if exists

答案 3 :(得分:1)

我建议Ben Bolker's solution,因为nrow(merge(row_to_find,X))>0解决方案对我不起作用(总是给出TRUE):

tail(duplicated(rbind(X,row_to_find)),1)>0

答案 4 :(得分:0)

对于vector,y,与dataframe中的列具有相同数量的元素,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

答案 5 :(得分:0)

对于dplyrtidyverse的粉丝,您可以使用dplyr:anti_join()。根据其文档,dplyr::anti_join(x, y)&#34;会返回x中所有y中没有匹配值的行,只保留x中的列。&#34;因此,对于dplyr::anti_join(row, df),结果为零行,row确实在df中,如果它有一行,则row不在df。< / p>

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

答案 6 :(得分:0)

另一种方法,使用基础 R:

df <- data.frame(a = c(1, 2), b = c("cat", "dog"))
any(df$a == 1 & df$b == "cat")
#> [1] TRUE