0

複雑なデータベース出力をワイド形式からロング形式に変換する際に問題があります。数百の行と約 1,000 の列があります。次のようになります。

広い自由度と溶融結果

問題は、df1_long の変数または df1_wide の列に、選択したい情報が含まれていることです。だから私はむしろこのようなものを持ちたいです:

ID       part   task    subgroup    type    result
Ind_A       a     12          aa       2    yes
Ind_A       a     12          bb       2    yes
Ind_A       b     12          aa       3    opt_1
Ind_A       b     13          aa       4    100
Ind_B       a     12          aa       2    no
Ind_B       a     12          bb       2    yes
Ind_B       b     12          aa       3    opt_2
Ind_B       b     13          aa       4    50
Ind_C       a     12          aa       2    no
Ind_C       a     12          bb       2    no
Ind_C       b     12          aa       3    opt_1
Ind_C       b     13          aa       4    200

数値/結果が文字に変換されることは気にしません。

stack() または reshape() 関数でそれを達成する簡単な方法はありますか? または、列名に対していくつかの strsplits コマンドを実行して関連情報を抽出し、それらを別の新しい列に格納する関数をコーディングする必要がありますか。

長い形式は、操作がはるかに簡単で、データセットに質問するのがはるかに簡単です。これらの不可解な列名を持つ 1000 を超える列に対して何かをコーディングすることは、私には悪夢のように見えます。

4

1 に答える 1

4

いいよ。私は屈服します。

これがあなたのデータです:

df1_wide <- data.frame(v1 = c("Ind_A", "Ind_B", "Ind_C"), 
                       v2 = c("Y", "N", "N"), v3 = c("Y", "Y", "N"), 
                       v4 = c("op1_1", "opt_2", "opt_1"), 
                       v5 = c(100, 50, 200))
rownames(df1_wide) <- letters[1:3]
colnames(df1_wide) <- c("ID", "a_t12_aa (Type # 2)", "a_t12_bb (Type # 2)", 
                        "b_t12_aa (Type # 3)", "b_t13_aa (Type # 4)")
df1_wide
#      ID a_t12_aa (Type # 2) a_t12_bb (Type # 2) b_t12_aa (Type # 3) b_t13_aa (Type # 4)
# a Ind_A                   Y                   Y               op1_1                 100
# b Ind_B                   N                   Y               opt_2                  50
# c Ind_C                   N                   N               opt_1                 200

これまでに行ったことは次のとおりです。

df1_long <- melt(df1_wide, id.vars="ID")

これはあなたが望むように聞こえるものです:

cbind(df1_long["ID"],
      colsplit(gsub("\\s|\\(Type|\\)|#", " ", df1_long$variable), 
               pattern="_|\\s+", 
               names = c("part", "task", "subgroup", "type")),
      df1_long["value"])
#       ID part task subgroup type value
# 1  Ind_A    a  t12       aa    2     Y
# 2  Ind_B    a  t12       aa    2     N
# 3  Ind_C    a  t12       aa    2     N
# 4  Ind_A    a  t12       bb    2     Y
# 5  Ind_B    a  t12       bb    2     Y
# 6  Ind_C    a  t12       bb    2     N
# 7  Ind_A    b  t12       aa    3 op1_1
# 8  Ind_B    b  t12       aa    3 opt_2
# 9  Ind_C    b  t12       aa    3 opt_1
# 10 Ind_A    b  t13       aa    4   100
# 11 Ind_B    b  t13       aa    4    50
# 12 Ind_C    b  t13       aa    4   200

私が使用した正規表現がgsub実際のデータで機能することを保証することはできませんが、これで正しい方向に進むことができれば幸いです。

将来的には、データのスクリーンショットを共有しても意味がないことに注意してください。この質問で行ったようにデータを共有してください。他の人が簡単にコピーして貼り付けて、あなたを助けようとすることができます.


将来的には、の行に沿って変数の名前を変更することを検討することをお勧めします。a_t12_aa_2その場合、colsplitステップはcolsplit(variable, "_", c("part", "task", "subgroup", "type")).

于 2013-08-15T17:06:21.120 に答える