使用R选择从哪里开始的程序

beg*_*neR 1 r plyr sqldf data.table

我有两个数据帧,这是第一个:

df <- data.frame(p=letters[1:3],y1=c(2,4,3))
df
  p y1
1 a 2
2 b 4
3 c 3
Run Code Online (Sandbox Code Playgroud)

第二个:

df2 <- data.frame(p=rep(letters[1:3],c(3,2,4)),y2=c(3,1,1,4,3,4,3,3,1),d=rep(1,length=9))
df2
  p y2 d
1 a 3 1
2 a 1 1
3 a 1 1
4 b 4 1
5 b 3 1
6 c 4 1
7 c 3 1
8 c 3 1
9 c 1 1
Run Code Online (Sandbox Code Playgroud)

我想要做的是获取这些行df2,其中p(a,b,c等)的每个值在哪里d=1(在这种情况下是所有行),y2大于y1pin 分组df.

因为这个原因也许是没有意义的,需要两条线被踢:第1行df2,因为a,y2=3大于y1=2df,和第6行,因为cdf2,y具有价值4,但该值cdf3 .

因为我正在使用data.tables,所以"data.table-solution"会很好,可能是这样的:

setkey(df2,d)
df2[1,y>??,by="p"] 
Run Code Online (Sandbox Code Playgroud)

ags*_*udy 6

您应该merge在子集之前使用.

使用data.table:

library(data.table)
merge(data.table(df1,key='p'),
      data.table(df2,key='p'))[d==1 & y2 > y1]
   p y1 y2 d
1: a  2  3 1
2: c  3  4 1
Run Code Online (Sandbox Code Playgroud)

使用base merge:

subset(merge(df1,df2), d==1 & y2 > y1)
  p y1 y2 d
1 a  2  3 1
6 c  3  4 1
Run Code Online (Sandbox Code Playgroud)

编辑

对于data.table解决方案,最好使用连接Y [X],使用X的键查找Y的行.(LEFT OUTER JOIN)

DF2 <- data.table(df2,key='p')
DF1 <- data.table(df1,key='p')
DF2[DF1][d==1 & y2 > y1]

   p y2 d y1
1: a  3 1  2
2: c  4 1  3
Run Code Online (Sandbox Code Playgroud)

  • @Macs是的,但是`[`更快,写得更短,更符合`data.table`理念 (2认同)