2017-06-23 6 views
0

私が持っているもの:文字列を整理する方法は?

test_df <- data.frame(isolate=c(1,2,3,4,1,2,3,4,5),label=c(1,1,1,1,2,2,2,2,2),alignment=c("--at","at--","--at","--at","a--","acg","a--","a--", "agg")) 

> test_df 
    isolate label alignment 
1  1  1 --at 
2  2  1 at-- 
3  3  1 --at 
4  4  1 --at 
5  1  2 a-- 
6  2  2 acg 
7  3  2 a-- 
8  4  2 a-- 
9  5  2 agg 

私が欲しい

私は、2つの列、位置や文字に整列フィールドを爆発したいと思います:

> test_df 
    isolate label aln_pos aln_char 
1  1  1  1 - 
2  1  1  2 - 
3  1  1  3 a 
4  1  1  4 t 
... 

ありませんすべてのアラインメントは同じ長さですが、同じラベルのすべてのアライメントは同じ長さです。

私は独自の列を持って、私は、キーと値のペアの中にそれらの列を回しgather使用し、その後、最初のそれぞれの位置を作るためにseparateを使用することができます考えていた:私はを試してみた何

。しかし、私は別個の部分を得ることができませんでした。

答えて

1

を返します。

test_df <- data.frame(isolate=c(1,2,3,4,1,2,3,4,5), 
         label=c(1,1,1,1,2,2,2,2,2), 
         alignment=c("--at","at--","--at","--at","a--","acg","a--","a--", "agg"), 
         stringsAsFactors = FALSE) 

library(tidyverse) 

test_df %>% 
    mutate(alignment = strsplit(alignment,"")) %>% 
    unnest(alignment) 
+0

、これはそれをしないし。 '%>%group_by(label、isolate)%>%mutate(align_pos = row_number())'にパイプすることで位置も取得されます。 – elsherbini

1

ベースRでは、このようにstrsplitのリストを作成しながらインデックスを作成することができます。

# make variable a character vector 
test_df$alignment <- as.character(test_df$alignment) 
# get list of individual characters 
myList <- strsplit(test_df$alignment, split="") 

そして、ここで

# construct data.frame 
final_df <- cbind(test_df[rep(seq_len(nrow(test_df)), lengths(myList)), 
          c("isolate", "label")], 
        aln_pos=sequence(lengths(myList)), 
        aln_char=unlist(myList)) 

は、我々は元data.frameの最初の2つの列を取るdata.frameを構築し、それを言って2番目の引数にベクトル入力でrepを使用して行を繰り返して最初の引数で対応する値を何回繰り返すか。回数はlengthsで計算されます。 cbindの2番目の引数は、sequenceへの呼び出しで、同じlengths出力を受け取ります。これにより、1から対応する長さにカウントが生成されます。 3番目の引数はリストにない文字の値です。

これはあなたがtidyr::gatherを述べているので、あなたはこの試みることができる

head(final_df, 10) 
    isolate label aln_pos aln_char 
1   1  1  1  - 
1.1  1  1  2  - 
1.2  1  1  3  a 
1.3  1  1  4  t 
2   2  1  1  a 
2.1  2  1  2  t 
2.2  2  1  3  - 
2.3  2  1  4  - 
3   3  1  1  - 
3.1  3  1  2  - 
関連する問題