2016-07-19 35 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轉換爲'start node'和'end node'的形式。

例如,繪製序列 'A-B-C' 和 'a-d',我需要以下data.frame:

start end 
    a b 
    b c 
    a d 

我怎樣才能做到這一點?

+0

這是不明確的預期輸出。對於第一個輸出,'library(splitstackshape); cSplit(df,「sequence」,「 - 」)' – akrun

+0

我將第一個data.table轉換爲問題中的第二個。我期望的是問題中的第三個data.table。再次感謝@akrun。 – tshan

+1

爲什麼'c'行不在輸出中? – akrun

回答

2

我們可以嘗試

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

使用strsplit和應用:

# 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

相關問題