检查一个含有数值的行是否属于R中的数据框。

4
可能重复:
如何在数据框中查看行是否存在? 假设我在R语言中有以下的数据框。
df = data.frame('a'=c(1:3), 'b'=c(4:6))

这个数据框包含三行:(1,4), (2,5) 和 (3,6)。假设我不知道数据框df包含哪些行,并想要检查一行(1,4)是否属于它,该怎么办呢?
我的实际情况涉及27个参数值的比较。有没有解决方法可以在不输入每个参数名称的情况下完成这个任务?谢谢!
我之所以这样做是因为我有一个名为masterdata的R数据集,其中包含模拟数据。我想用来自额外模拟运行的新数据更新此数据集,但可能会忘记已经使用某个参数组合运行了模拟,因此masterdata将扩展为重复值。稍后我可以去除这些重复值,但如果值是重复的,我不希望整个更新数据集的过程都要经过。为此,我需要检查模拟运行的数据是否已经存在于masterdata中。如果我知道如何检查给定行是否属于masterdata,我就可以做到这一点。谢谢。

1
你可能会在这个早期的问题中找到一些想法:Existing function for seeing if a row exists in a data frame? - Marek
谢谢链接,Marek。我不知道那个帖子。 - Curious2learn
那里有两个解决方案,一个是你的(与这里的类似),另一个是Hadley的。哪一个更快?谢谢。 - Curious2learn
@Curious2learn 我认为这取决于数据:行数、列数和列的类型。 - Marek
@Curious2learn 我运行了一些测试,似乎Hadley的方法更快(对于宽数据框而言,速度提高了约3倍)。 - Marek
我投票支持重新开放 - OP 的真正目的是删除重复行,因此这是一个不同于之前问题的问题。 - mbq
4个回答

6

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

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

将其执行:换句话说,将新行附加到数据框的末尾,并查看它是否重复。


我同意你的回答 ;) - Marek

2

如果您只想比较数据框中的两列,则可以采用以下方法:

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

这也许比其他矢量化解决方案更快。

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

我的实际情况涉及比较27个参数值。是否有矢量化的解决方案,这样我就不必输入每个参数名称了吗?谢谢! - Curious2learn
@Curious2learn - 看看@Ben的答案,那是通向启蒙之路。他正在引导你朝着正确的方向前进。 - Chase

-1

你只需要一个独特的调用:

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

1
这与 OP 所问的完全不符 :( - agoldev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接