11

間違って入力されたデータをクリーンアップしようとしています。変数に関する質問では、1 から 5 までの番号が付けられた 5 つの選択肢から複数の回答を得ることができます。データは次のように入力されています (これは単なる例です。実際のデータには、さらに多くの変数と観測値があります。フレーム):

data
          V1
1    1, 2, 3
2    1, 2, 4
3 2, 3, 4, 5
4    1, 3, 4
5    1, 3, 5
6 2, 3, 4, 5

そのサンプル データを再作成するコードを次に示します。

data = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", 
                         "1, 3, 4", "1, 3, 5", "2, 3, 4, 5"))

私が実際に必要としているのは、より多くのデータを処理することです...バイナリ--「はい/いいえ」の質問のセットのように--より似たデータフレームに入力されます:

data
    V1.1  V1.2  V1.3  V1.4  V1.5
1      1     1     1    NA    NA
2      1     1    NA     1    NA
3     NA     1     1     1     1
4      1    NA     1     1    NA
5      1    NA     1    NA     1
6     NA     1     1     1     1

現時点では、実際の変数名は問題ではありません。簡単に修正できます。また、欠落している要素が「O」、「NA」、または空白であるかどうかはあまり重要ではありません。これも後で修正できます。

transformパッケージの関数と を使用してreshapeさまざまなものを使用しようとしましたstrsplitが、探していることを実行することはできません。Stackoverflow に関する他の多くの関連する質問も調べましたが、まったく同じ問題ではないようです。

4

3 に答える 3

8

関数を記述して使用するだけですapply。最初のダミーデータ:

##Make sure you're not using factors
dd = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", 
                         "1, 3, 4", "1, 3, 5", "2, 3, 4, 5"), 
                     stringsAsFactors=FALSE)

次に、行を受け取り、必要に応じて変換する関数を作成します

make_row = function(i, ncol=5) {
  ##Could make the default NA if needed
  m = numeric(ncol)
  v = as.numeric(strsplit(i, ",")[[1]])
  m[v] = 1
  return(m)
}

次にapply、結果を使用して転置します

t(apply(dd, 1, make_row))
于 2012-04-11T06:33:12.627 に答える
8

長い時間が経って、ようやくこの種のデータを効率的に処理するパッケージ ( 「splitstackshape」 ) を作成することができました。したがって、他の人の便宜のために (そしてもちろん自己宣伝も)、ここにコンパクトなソリューションを示します。

この問題に関連する関数は ですcSplit_e

まず、元の列を保持しNA、塗りつぶしとして使用するデフォルト設定:

library(splitstackshape)
cSplit_e(data, "V1")
#           V1 V1_1 V1_2 V1_3 V1_4 V1_5
# 1    1, 2, 3    1    1    1   NA   NA
# 2    1, 2, 4    1    1   NA    1   NA
# 3 2, 3, 4, 5   NA    1    1    1    1
# 4    1, 3, 4    1   NA    1    1   NA
# 5    1, 3, 5    1   NA    1   NA    1
# 6 2, 3, 4, 5   NA    1    1    1    1

次に、元の列を削除し0て塗りつぶしとして使用します。

cSplit_e(data, "V1", drop = TRUE, fill = 0)
#   V1_1 V1_2 V1_3 V1_4 V1_5
# 1    1    1    1    0    0
# 2    1    1    0    1    0
# 3    0    1    1    1    1
# 4    1    0    1    1    0
# 5    1    0    1    0    1
# 6    0    1    1    1    1
于 2013-09-03T16:14:52.110 に答える