2016-08-08 13 views
0

と入力から名前と値のペアのデータフレームを作成します。私はこのコードで作成することができ、データフレーム持っている区切り文字

ID Destination Topic 
1 1  A\r\nB  W 
2 2   C  X 
3 3 D\r\nE\r\nF Y\r\nZ 

私がしたい:それはこのようになります

input <- data.frame('ID'=c(1:3), 
         Destination=c("A\r\nB", "C", "D\r\nE\r\nF"), 
         Topic=c("W", "X", "Y\r\nZ")) 

を区切り文字\r\nが発生するたびに、

desiredOutput <- data.frame( 
    ID = c(1,1,1,2,2,3,3,3,3,3) , 
    name=c("Destination", "Destination", "Topic", "Destination", "Topic", 
      "Destination", "Destination", "Destination" , "Topic", "Topic"), 
    value=c("A","B", "W", "C", "X", "D", "E", "F", "Y", "Z")) 

    ID  name value 
1 1 Destination  A 
2 1 Destination  B 
3 1  Topic  W 
4 2 Destination  C 
5 2  Topic  X 
6 3 Destination  D 
7 3 Destination  E 
8 3 Destination  F 
9 3  Topic  Y 
10 3  Topic  Z 

:次のようになり、出力データフレームを作成します私は正しいID、列の名前、および対応する値で、内容を別々の行に分割したいと思います。

strsplitを使用して1つの列をリストに分割することはできますが、ループを作成しようとすることを除いて、上記のように内容をデータフレームに入れる方法はわかりません。私はtidyrパッケージが役に立つと思っています。

strsplit(input$Destination, split = "\r\n") 

これはどのようにして、ループなしで行うことができますか?長い形式にtidyrで

答えて

1

gather、その後、参加の要素を区切るためにseparate_rowsを使用します。

library(tidyr) 

input %>% gather(name, value, -ID) %>% separate_rows(value) 
## ID  name value 
## 1 1 Destination  A 
## 2 1 Destination  B 
## 3 2 Destination  C 
## 4 3 Destination  D 
## 5 3 Destination  E 
## 6 3 Destination  F 
## 7 1  Topic  W 
## 8 2  Topic  X 
## 9 3  Topic  Y 
## 10 3  Topic  Z 

注:お使いのデータではなく、文字の要因である場合、それはに強制しては、tidyrは、警告が表示されます文字を並べ替えるにはそれは無関係に動作しますが、警告を嫌うならば、キャラクタに手を加えて手作業で修正してください。

+1

ニース。私は 'library(data.table);のようにdata.tableで同じことを考えていました。私はあなたの構文がここでより好きです –

+0

これは非常にエレガントですが、データを分割しないでください。私は 'A_B \ r \ nC_D'のような例を持っています。 '\ r \ n 'によってのみ分割されるべきではありません。 – Bobby

+2

ああ、「分離」は英数字以外の文字が区切り文字であることを前提としています。制限するには、次のように指定します: 'separate_rows(value、sep = '\ r \ n')' – alistaire

1

はここdata.table

library(data.table) 
melt(setDT(input), id.var = "ID", variable.name = "name")[, 
     .(value = unlist(strsplit(value, "\\s+"))), .(ID, name)][order(ID)] 
#  ID  name value 
#1: 1 Destination  A 
#2: 1 Destination  B 
#3: 1  Topic  W 
#4: 2 Destination  C 
#5: 2  Topic  X 
#6: 3 Destination  D 
#7: 3 Destination  E 
#8: 3 Destination  F 
#9: 3  Topic  Y 
#10: 3  Topic  Z 

EDITを使用してオプションである:同様のソリューションは、他の溶液中で@DavidArenburgでコメントしました(私は以前見ませんでした)。

関連する問題