是否存在用于确定数据帧中是否存在行的现有函数? 我想可以做一个申请/相同,但似乎我错过了一些东西。
例如:
给出这样的数据框:
a b
1 1 cat
2 2 dog
是否有现有的功能可以让我测试数据框中是否存在行(1, cat)
?
谢谢, 扎克
答案 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)
对于dplyr
和tidyverse
的粉丝,您可以使用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