2016-04-14 4 views
2

に基づいてRに複数の列を作成し、 は、私がデータフレームで2列が他の列

以下
no value 
1 A_0.9 
1 B_0.8 
1 C_0.7 
1 D_0.7 
2 B_0.9 
2 D_0.8 
2 A_0.7 
2 C_0.7 

を参照してください私は

no value1 value2 value3 value4 
1 A_0.9 B_0.8 C_0.7 D_0.7 
2 B_0.9 D_0.8 A_0.7 C_0.7 

すなわち、以下のように新しいデータフレームを作成するための:列「値」のデータを使用して複数の列が作成されます。

+1

人々が列の内容をより簡単に見ることができるようにデータを再フォーマットすることは面白いでしょう。個人的には、あなたの表現に2列のデータフレームがありません。そうすることで、適切な回答が得られる可能性が高くなります。 – Eduardo

+0

さて、エクセルからデータをコピーしましたが、私が質問を投稿したときにはテキスト形式でした。私、これはデータ広告の要件を理解するのに役立ちます場合、私はデータフレームに2列を持って、私を知ってみましょう1でコピーして貼り付けCOL 1なり、コル1 下記をご参照ください:なしコル2:値 A_0.9 B_0.8 C_0.7 D_0.7 B_0.9 D_0.8 A_0.7 C_0.7 私は、新たなデータフレームを作成したいです以下のようにして計算される。1 コル2:VALUE1 A_0.9 B_0.9 コル3:値2 B_0.8 D_0.8 コル4:VALUE3 C_0.7 A_0.7コル5:value4 D_0.7 C_0 .7 – user3734568

答えて

1

にフィットするように、我々はrleid()noでユニークなvalueあたりのシーケンスを作成し、その結果、ワイドフォーマットにdcast()にデータを使用することができます。

library(data.table) 
dcast(setDT(df)[, nr := rleid(value),by = no], no ~ nr) 
# no  1  2  3  4 
#1 1 A_0.9 B_0.8 C_0.7 D_0.7 
#2 2 B_0.9 D_0.8 A_0.7 C_0.7 

それともdata.tabledev version (1.9.7)と、次は、感謝@Arun可能です!

dcast(setDT(df), no ~ rowid(no, prefix = 'value')) 
# no value1 value2 value3 value4 
#1: 1 A_0.9 B_0.8 C_0.7 D_0.7 
#2: 2 B_0.9 D_0.8 A_0.7 C_0.7 
+0

これを共有してくれてありがとうmtoto。 – user3734568

+0

あなたは歓迎します。このソリューションは 'unstack'アプローチよりも約400倍高速です。 – mtoto

+0

私は、上記のコードは、私が共有したデータフレームの例で列 "no"で利用可能な各グループの不等な観察に非常に役立つことに気付きました。あなたが共有したコードは、小さなデータセットでは完全に機能しましたが、大規模なデータセットでこれらのコードを試したときに、値の列に 'nr'を使用しました。 'value.var'を使用してオーバーライドしてください 集合関数が、長さ ''である。これらは何だったのか分かりません。私はrequried dataframeを取得しませんでした。以下は、私が使用したコードです。 – user3734568

2
t(unstack(df, value ~ no)) 
# [,1] [,2] [,3] [,4] 
#X1 "A_0.9" "B_0.8" "C_0.7" "D_0.7" 
#X2 "B_0.9" "D_0.8" "A_0.7" "C_0.7" 

BOVE出力がdata.tableを使用してデータ、

library(dplyr) 
df1 <- as.data.frame(t(unstack(df, value ~ no))) 
names(df1)[-1] <- paste0('value', 2:ncol(df1)-1) 
rownames(df1) <- NULL 
df1 <- add_rownames(df1, 'no') #from dplyr package 
# no value1 value2 value3 value4 
# (chr) (fctr) (fctr) (fctr) (fctr) 
#1  1 A_0.9 B_0.8 C_0.7 D_0.7 
#2  2 B_0.9 D_0.8 A_0.7 C_0.7 
+0

これは完全に動作しています。私はただ1つのクエリーを持っています。colの各固有番号の4つ以上の値があるかもしれないので、列の名前は他の方法である – user3734568

+0

@ user3734568、編集された答えを参照してください。 – Sotos

+0

お返事ありがとうございました。 – user3734568

0

私は、データ操作機能の素敵なセットをラップreshapeライブラリを、使用します。あなたの仕事を達成するための例:

n = c(1,1,1,1,2,2,2,2) 
x = c('A', 'B', 'C', 'D', 'A', 'B', 'C', 'D') 
# Just to create the column names you showed in the example 
columns = rep(paste("value", 1:4, sep=""), 2) 
data = data.frame(n, columns, x) 
cast(data, n~columns) 
+1

ここで' columns'を定義する方法は、サンプルのデータセットに対してのみ適切であり、スケーラブルではありません。 – mtoto

関連する問題