首先,我已经完成了这些
但是,我找不到解决方案。我有两个数据帧
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值。
答案 0 :(得分:2)
以下是使用merge
和with
的基础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)),]