2

だから私はデータセットを持っています(これはおもちゃの例です)

dates <- c(1,1,1,2,2,2,3,3,3)
dates2 <- c(-1,1,2,-1,1,2, -1, 2,3) 
amt <- c(1000, 100, 100, 1000, 100, 100, 1000, 100, 100)

dat <- cbind(dates, dates2, amt)

そして、データフレームdatの場合、amtをそれ自体で割る必要がありますが、dates2が= -1の場合のみです。したがって、次のような出力データフレームを取得します。

clean
1 1 0.10  (IE 100 / 1000, for row 2)
1 2 0.10
2 1 0.10
2 2 0.10
3 2 0.10
3 3 0.10

誰かがこれに取り組む簡単な方法を知っていますか? (私の脳は今どろどろのようです)

4

2 に答える 2

3

アップデート:

ナイス、ワンライナー、@Arunの賛辞(以下のコメントで):

DT[, amt := { amt <- amt/amt[dates2 == -1] }, by=dates][dates2 != -1]

または、より簡潔に言うと、次のようになります。

DT[, amt := amt/amt[dates2 == -1], by=dates][dates2 != -1]

元の回答:

library(data.table)

DT <- data.table(dat, key="dates")

# grab "-1" rows, at same time, change col name for simplicity
DT.dates2 <- setnames(DT[dates2==(-1)], "amt", "amt.d")

# remove rows where dates2 == -1
DT <- DT[dates2 != -1] 

# divide as required
DT[DT[dates==dates2][DT.dates2], amt := amt / amt.d]

結果:

DT 

   dates dates2 amt
1:     1      1 0.1
2:     1      2 0.1
3:     2      1 0.1
4:     2      2 0.1
5:     3      2 0.1
6:     3      3 0.1
> 
于 2013-04-24T05:05:23.003 に答える
1
 by(dat, dat[1], FUN= function(dfm) {
        dfm[ dfm$dates2 != -1, 3] <-dfm[ dfm$dates2!= -1, 3]/dfm[ dfm$dates2== -1, 3]
        return(dfm[ dfm$dates2 !=-1 ,])  } )
dates: 1
  dates dates2 amt
2     1      1 0.1
3     1      2 0.1
----------------------------------------------------------------------------- 
dates: 2
  dates dates2 amt
5     2      1 0.1
6     2      2 0.1
----------------------------------------------------------------------------- 
dates: 3
  dates dates2 amt
8     3      2 0.1
9     3      3 0.1

do.call(rbind, ...)それらを再びデータフレームとして使用したい場合に使用できます。

于 2013-04-24T05:05:03.950 に答える