1

私は次の形式のデータを持っています:

id   source
1    m
1    p
1    l1
1    l1
2    t
2    q
3    p
3    l1
3    n
3    l1

ここで、すべてのIDについて、ソースで発生したl1を識別し、l1の前の観測値を抽出したいと思います。たとえば、id 1の場合、l1の3番目のソースとそれ以前の観測値はpです。したがって、私のデータは次のようになります。

id    source
1      p
3      p
3      n

これをRで作成するにはどうすればよいですか?

4

4 に答える 4

3

data.tableソリューション

 library(data.table)

 dd <- data.table(df)
 dd[, source[match('l1', source)-1L],by = id]
于 2013-03-20T06:23:18.347 に答える
1

より直接的な方法があるかもしれませんが、これを試してください:

#get your data
test <- read.table(text="id   source
1    m
1    p
1    l1
1    l1
2    t
2    q
3    p
3    l1
3    n
3    l1",header=TRUE)

# do some picking of the cases
result <- do.call(rbind,by(test,test$id,function(x) x[which(x$source=="l1")-1,]))
result <- result[result$source!="l1",]

これは次のようになります。

> result
  id source
2  1      p
7  3      p
9  3      n
于 2013-03-20T05:35:36.340 に答える
1

これが別のdata.tableソリューションです。以前のバージョンでは、@mnelから正解のように見えるものを取得できませんでした。

library(data.table)

## Create the test data table:
dt <- data.table(id=c(1,1,1,1,2,2,3,3,3,3),
                 source1=c("m","p","l1","l1","t","q","p","l1","n","l1"))

dt[,list(id, source1, source0=c(NA,source1[seq_len(.N-1L)]))][source1=="l1"]

##    id source1 source0
## 1:  1      l1       p
## 2:  1      l1      l1
## 3:  3      l1       p
## 4:  3      l1       n

これは、前の行(または最初の行の場合はNA)を取得するデータテーブルに列source0を追加しています。これは行番号であり、前の行番号を取得するために.N使用しています。seq_len次に、元のsource1の値が「l1」である結果をサブセット化します。

于 2013-06-24T04:40:32.767 に答える
0

これは、Rのベースからの単純な関数のみを使用するベクトル化されたソリューションです。

DFが入力データフレームの場合、はsel論理ベクトルであり、そのTRUEコンポーネントが必要な行を選択します。&記号で接続された3つの用語は、これらの行を選択します。

  • 次の行のsource列が「l1」に等しく、
  • l1ソース列が
  • 次の行が最初ではないようなものですid

の長さはselの行数より1少ないため、のリサイクルを避けるDFために使用します。whichsel

is.l1 <- DF$source == "l1"
sel <- is.l1[-1] & !is.l1[-nrow(DF)] & duplicated(DF$id)[-1]
DF[which(sel),]

最後の行の結果は次のとおりです。

  id source
2  1      p
7  3      p
9  3      n
于 2013-04-06T23:58:46.643 に答える