使用来自非重复但类似索引的较小数据帧的值来子集重复索引数据帧

时间:2017-11-07 18:00:47

标签: r dataframe subset

首先,我已经完成了这些

但是,我找不到解决方案。我有两个数据帧

big<- data.frame(ID=rep(1:10,each=6),V= seq(1,30,1.5))

small<- data.frame(ID=1:10,Vmean= c(8.0,15,23.1,2.2,1,2.1,10,7,14,21))

你会注意到两个dfs中的ID是相同的,但是在df中它会重复,并且每个重复的行都有不同的V.

我想要实现的目标是:

使用来自df小和相应的Vmean的ID,我想要子集并删除df大的行,这些行具有相似的ID,但其中V的值大于df small中相应的Vmean值。

1 个答案:

答案 0 :(得分:2)

以下是使用mergewith的基础R中的方法。

big[with(merge(big, small, by="ID"), V <= Vmean),]

合并ID上的data.frames。在with内使用此对象可以对V和Vmean变量进行逻辑比较。 with的输出将是一个逻辑向量,您可以使用它来将data.frame命名为big。

返回

   ID    V
1   1  1.0
2   1  2.5
3   1  4.0
4   1  5.5
5   1  7.0
7   2 10.0
8   2 11.5
9   2 13.0
10  2 14.5
13  3 19.0
14  3 20.5
15  3 22.0
21  4  1.0
41  7  1.0
42  7  2.5
43  8  4.0
44  8  5.5
45  8  7.0
49  9 13.0

请注意,这假设ID在small data.frame中是唯一的,而small data.frame包含big包含的所有ID。此外,它假设big按ID排序。

更强大的是分两步执行操作

datNew <- merge(big, small, by="ID", all.x=TRUE)
datNew <- datNew[V <= Vmean | is.na(Vmean)),]