2016-07-19 7 views
0

で私は、このフォームのdata.frameありますに '(ABC)' '(ab)および(BC)' data.frame

sequence support 
1  a-b  0.6 
2  b-c  0.6 
3  a-c  0.6 
4 a-b-c  1.0 
5  a-d  0.6 

を、私は次のようにこれを変換することができます。

1 2 3 support 
1 a b <NA>  0.6 
2 b c <NA>  0.6 
3 a c <NA>  1.0 
4 a b c  0.6 
5 a d <NA>  1.0 

は、私はこれを好きにテーブルの上に変換する必要があります。

1 2 support 
1 a b  0.6 
2 b c  0.6 
3 a d  1.0 

は具体的には、私はサンキー図を描きたいです。

私は最初のdata.tableを '開始ノード'と '終了ノード'の形式に変換する必要があります。たとえば、シーケンス 'A-B-C' と '-d' を描くために、私は、次のdata.frameを

が必要になります。

start end 
    a b 
    b c 
    a d 

はどうすればこれを行うことができますか?

+0

それは期待される出力については明らかではありません。最初の出力では、 'library(splitstackshape); cSplit(df、" sequence "、" - ")' – akrun

+0

私は最初のdata.tableを質問の2番目のものに変換しました。私が期待していたのは、質問の3番目のデータテーブルです。再度ありがとう、@akrun。 – tshan

+1

なぜ 'c'行が出力にないのですか? – akrun

答えて

2

我々はstrsplitを使用して

library(splitstackshape) 
i1 <- grepl("-[^-]+-", df$sequence) 
df$sequence[i1] <- sub("-[^-]+", "", df$sequence[i1]) 
res <- cSplit(df[!(duplicated(df$sequence)|duplicated(df$sequence, 
       fromLast=TRUE)),], "sequence", "-") 
res[, 2:3, with = FALSE] 
# sequence_1 sequence_2 
#1:   a   b 
#2:   b   c 
#3:   a   d 
3

試してみて、適用することができます。

# data 
df1 <- read.table(text = "sequence support 
1  a-b  0.6 
2  b-c  0.6 
3  a-c  0.6 
4 a-b-c  1.0 
5  a-d  0.6", header = TRUE, as.is = TRUE) 

# result - input for sankey 
datSankey <- 
    do.call(rbind, 
      apply(df1, 1, function(i){ 
      x <- unlist(strsplit(i[1], "-")) 
      cbind.data.frame(
       From = x[1:length(x) - 1], 
       To = x[2:(length(x))], 
       Weight = as.numeric(i[2]), 
       deparse.level = 0) 
      }) 
) 

#    From To Weight 
# 1    a b 0.6 
# 2    b c 0.6 
# 3    a c 0.6 
# 4.sequence1 a b 1.0 
# 4.sequence2 b c 1.0 
# 5    a d 0.6 

# plot 
library(googleVis) 
plot(gvisSankey(datSankey, 
       from = "From", to = "To", weight = "Weight")) 

enter image description here

関連する問題