2

それで、私がそれをする効率的な方法を探していたので、この質問はしばらくの間私を悩ませてきました。基本的に、私はデータフレームを持っており、各行に実験からのデータサンプルがあります。これは、分析用のデータの最終バージョンではなく、実験からのログファイルとして見る必要があると思います。

私が抱えている問題は、時々、特定のイベントがデータの列に記録されることです。分析を扱いやすくするために、イベント間の空のセルの「ギャップを埋める」ことで、データの各行を発生した最新のイベントに関連付けることができます。これを説明するのは少し難しいですが、ここに例があります:

ベースデータセットのRStudioからのデータフレームのスクリーンショット

今、私はそれを取り、これに変えたいと思います:

ここに画像の説明を入力してください

そうすることで、現在のイベントごとにデータを分割できるようになります。他の言語では、forループを使用してこれを実行しますが、Rはそのタイプのループでは適切ではないことを知っています。この場合、数十万行のデータを並べ替えることができます。だから、誰かがこれを行うための迅速な方法の提案を提供できるかどうか疑問に思っていますか?

どうもありがとう。

4

2 に答える 2

5

この質問は、このサイトで何度もさまざまな形で尋ねられてきました。標準的な答えはを使用することzoo::na.locfです。[r]を検索na.locfして、使用方法の例を見つけてください。

これは、ベースRで次を使用する別の方法ですrle

d <- data.frame(LOG_MESSAGE=c('FIRST_EVENT', '', 'SECOND_EVENT', '', ''))
within(d, {
    # ensure character data
    LOG_MESSAGE <- as.character(LOG_MESSAGE)
    CURRENT_EVENT <- with(rle(LOG_MESSAGE), # list with 'values' and 'lengths'
                          rep(replace(values, 
                                      nchar(values)==0, 
                                      values[nchar(values) != 0]), 
                              lengths))
})
#    LOG_MESSAGE CURRENT_EVENT
# 1  FIRST_EVENT   FIRST_EVENT
# 2                FIRST_EVENT
# 3 SECOND_EVENT  SECOND_EVENT
# 4               SECOND_EVENT
# 5               SECOND_EVENT
于 2013-01-31T20:41:56.573 に答える
3

na.locf()ここではパッケージzooの関数が便利です。

require(zoo)
dat <- data.frame(ID = 1:5, sample_value = c(34,56,78,98,234),
                  log_message = c("FIRST_EVENT", NA, "SECOND_EVENT", NA, NA))

dat <-
  transform(dat,
            Current_Event = sapply(strsplit(as.character(na.locf(log_message)), 
                                            "_"),
                                   `[`, 1))

与える

> dat
  ID sample_value  log_message Current_Event
1  1           34  FIRST_EVENT         FIRST
2  2           56         <NA>         FIRST
3  3           78 SECOND_EVENT        SECOND
4  4           98         <NA>        SECOND
5  5          234         <NA>        SECOND

コードを説明するには、

  1. na.locf(log_message)係数 ( でデータが作成された方法)datを返します。NANA
  2. 1.の結果を文字列に変換
  3. strplit()この文字ベクトルに対して実行され、アンダースコアで分割されます。strsplit()文字ベクトル内の要素と同じ数の要素を含むリストを返します。この場合、各コンポーネントは長さ 2 のベクトルです。これらのベクトルの最初の要素が必要です。
  4. そこでsapply()、サブセット化関数を実行して'['()、各リスト コンポーネントから最初の要素を抽出します。
  5. 全体がラップされてtransform()いるので、i) 参照する必要がないdat$ので、結果を新しい変数としてデータに直接追加できますdat
于 2013-01-31T20:45:09.660 に答える