2016-07-15 19 views
0

データフレーム列のセミコロンを含む要素を、基本的なRを使用して列の下部にある分割されたエントリに置き換える関数を作成しようとしました。主な目的は次のとおりです。 applyでこの関数を使用し、セミコロンでエントリを検出すると常に追加します。セミコロンで分割するR

私のコードの主な問題は、追加の値なしでまったく同じデータフレームを返すことです。

> df 
rs2480711 
rs74832092 
rs4648658 
rs4648659 
rs61763535 
rs28733941;rs67677371 

>x 
"rs28733941;rs67677371" 

function(x){ 
semiCols = length(unlist(strsplit(x, ";"))) 
elementsRs = unlist(strsplit(x, ";")) 
if(semiCols>1){ 
for(i in 1:semiCols){ 
df = rbind(df, elementsRs[i]) 
}}} 

他のすべての値を変更せずに1つの値に基づいて行を分割するには、どのようにコードを拡張することができますか。私が正しく理解している場合たとえば、この

>df 
0 rs61763535    T1 
1 rs28733941;rs67677371 T2 

は、私は適切にあなたを得ることができなかった、これは再び

unlist(strsplit(as.character(df$V1),split = ";")) 

を動作しますが、この

>df2 
0 rs61763535    T1 
1 rs28733941    T2 
1 rs67677371    T2 
+0

期待される出力は何ですか?「x」は何ですか? – akrun

+0

@Sotos。それを試してみましたが、何らかの理由で空白の値を持つすべてのエントリを削除します。 – civy

+0

'splitstackshape :: cSplit(df、 'V2'、 ';'、 'long')'は私のために働きます – Sotos

答えて

1

のようになります。しかし、おそらくあなたはこれを探しています

apply(df,2,function(t) unlist(strsplit(as.character(t),split = ";"))) 
+0

ありがとう、私の一日を救った!私は複数の列があると仮定して、これをどのように拡張することができますか知っていますか?私は他のすべての値を同じにしたいが、nはセミコロンの数であるn個の新しい行を作成する。 – civy

+0

複数列のデータフレームに適用すると「dim(X)は正の長さでなければならない」というエラーが表示されます。私は1つの列だけを分割し、同じ行を持つがセミコロンの項目を持たないために残りの値をコピーすることに興味がある。 – civy

+0

オリジナルの投稿を編集しました。ご迷惑をおかけして申し訳ありませんが、 – civy