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大于y1按pin 分组df.
因为这个原因也许是没有意义的,需要两条线被踢:第1行中df2,因为a,y2=3大于y1=2中df,和第6行,因为c在df2,y具有价值4,但该值c在df3 .
因为我正在使用data.tables,所以"data.table-solution"会很好,可能是这样的:
setkey(df2,d)
df2[1,y>??,by="p"]
Run Code Online (Sandbox Code Playgroud)
您应该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)
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |