检查具有值的行是否属于R中的数据帧

时间:2011-06-13 01:36:26

标签: r

  

可能重复:
  Existing function for seeing if a row exists in a data frame?

假设我在R中有以下数据框。

df = data.frame('a'=c(1:3), 'b'=c(4:6))

此数据框包含三行:(1,4), (2,5) and (3,6)。假设我不知道哪些行df包含并想检查行(1,4)是否属于它,我该如何检查?

我的实际案例涉及27个参数值的比较。有没有一种解决方案可以在不输入每个参数名称的情况下完成此操作?谢谢!

我想这样做的原因是我有一个名为masterdata的R数据集,其中包含模拟数据。我想用新数据更新这个数据集,因为我使用不同的参数组合进行了额外的模拟运行。但是,我可能会忘记我已经为某个参数组合运行了模拟并且可能再次运行它,在这种情况下,masterdata将使用重复值进行扩展。我以后可以删除这些重复值,但如果值重复,我不希望更新数据集的整个过程。为此,我需要检查来自模拟运行的数据是否已存在于masterdata中。如果我知道如何检查给定行是否属于masterdata,我可以这样做。

感谢。

4 个答案:

答案 0 :(得分:6)

可能有更有效的方法,但我认为

tail(duplicated(rbind(masterdata,newvals)),1)

会这样做:换句话说,将新行附加到数据框的末尾,看看它是否重复。

答案 1 :(得分:2)

如果你只想比较data.frame中的两列,那么这就是一个技巧:

> which(df$a+df$b*1i == 1+4i)
[1] 1

这可能会或可能不会比其他矢量化解决方案更快。

答案 2 :(得分:1)

有很多方法可以做到这一点。您可以使用ifelse()这是一个矢量化解决方案,如果满足您的条件,则为数据帧的每一行返回一个布尔值。

> with(df, ifelse(a == 1 & b == 4, 1, 0))
[1] 1 0 0

由于您可能只想知道您的参数组合是否已经运行,因此您可以将sum()包裹在上一个命令周围:

> sum(with(df, ifelse(a == 1 & b == 4, 1, 0)))
[1] 1

另一种方法是使用nrow()subset()。我们将再次使用&运算符进行测试:

> nrow(subset(df, a == 1 & b == 4))
[1] 1

答案 3 :(得分:0)

您不需要任何一个唯一的电话:

Test<-data.frame(a=c(1,2,2,2,3),b=c(1,2,2,3,3),c=(1,2,2,2,3))
Test
unique(Test) #Same with duplicated rows removed