1

私は2つのデータフレームを持っています.これが最初のものです:

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

そして2番目のもの:

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

私がしたいのは、 (a、b、c など) のdf2各値(この場合はすべての行) がinでグループ化された行よりも大きいの行を取得することです。pd=1y2y1pdf

この説明はおそらく意味をなさないので、キックする必要がある 2 行:行 1 in df2、 for は in よりも大きいため、行6afor inの値が 4 であるため、 inの値は 3 です。 .y2=3y1=2dfcdf2ycdf

私はdata.tablesを扱っているので、「data.table-solution」がいいでしょう。

setkey(df2,d)
df2[1,y>??,by="p"] 
4

3 に答える 3

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

使用base merge:

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

編集

解決策として、data.tableX のキーを使用して Y の行を検索し、結合 Y[X] を使用することをお勧めします (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
于 2013-08-14T12:54:04.273 に答える
1

rmk に似ていますが、plyr を使用します。

library(plyr)
dfa <- data.frame(p=letters[1:3],y1=c(2,4,3))
dfa

dfb <- 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))
dfb

dfb <- join(dfa, dfb, by = "p", type = "left", match = "all")
dfb

dfb$z <- ifelse(dfb$y2>dfb$y1, 1, 0)
dfb[dfb$z==1, ]
于 2013-08-14T12:59:34.950 に答える
0

試す:

df3 <- merge(df,df2,by=1)
> df3
  p y1 y2 d
1 a  2  3 1
2 a  2  1 1
3 a  2  1 1
4 b  4  4 1
5 b  4  3 1
6 c  3  4 1
7 c  3  3 1
8 c  3  3 1
9 c  3  1 1


> df3[df3$y2>df3$y1 & df3$d==1,]
  p y1 y2 d
1 a  2  3 1
6 c  3  4 1
于 2013-08-14T12:51:50.537 に答える