2017-06-22 56 views
1

我有一個數據幀「clinDF」我有更新基於一個又一個,「parsingDF」,通過R比方說:解析基於另一個數據幀的數據幀? (?通過細胞的細胞)

#clinDF 
    P1 P2 P3 P4 
A M F M M 
B H M L M 
C 3 4 1 0 

#parsingDF 
    feat var col 
[1] A  M #B3E2CD 
[2] A  F #E41A1C 
[3] B  H #A6CEE3 
[4] B  M #FCCDE5 
[5] B  L #8DD3C7 
[6] C  0 #BC80BD 
[7] C  1 #A6CEE3 
[8] C  3 #B3E2CD 
[9] C  4 #E41A1C 

我的目標是解析clinDF這樣我得到相應的col

#out: 
    P1  P2  P3  P4 
A #B3E2CD #E41A1C #B3E2CD #B3E2CD 
B #A6CEE3 #FCCDE5 #8DD3C7 #FCCDE5 
C #B3E2CD #E41A1C #A6CEE3 #BC80BD 

理想情況下,我想要的代碼,以儘可能一般無法通過設置clinDF[clinDF==3]=#B3E2CD改變clinDF所有。有沒有更好的方法來做到這一點,比使用兩個for循環,逐行逐列讀取?

預先感謝您

+0

其實,現在我看到他們都是矩陣,但data.frame工作將是我猜 – Sosi

回答

2

這裏是我的解決辦法〜

library(Reshape) 
library(Reshape2) 
    Table1=melt(as.matrix(clinDF)) 
    Table1=merge(Table1,parsingDF,by.x=c('X1','value'),by.y=c('feat','var'),all.x=T) 
    dcast(Table1, X1~X2, value.var="col") 

    X1 P1  P2  P3  P4 
1 A #B3E2CD #E41A1C#B3E2CD #B3E2CD 
2 B #A6CEE3 #FCCDE5 #8DD3C7 #FCCDE5 
3 C#B3E2CD #E41A1C#A6CEE3 #BC80BD 
2

我們可以data.table做到這一點。由於兩個數據集都是矩陣,因此將'clinDF'轉換爲'long'格式,轉換爲data.tablesetDT/as.data.table),加入on數據集的'feat/var''Var1/value'列並將其重新設置爲'wide'與acast格式從reshape2

library(data.table) 
library(reshape2) 
dM <- melt(clinDF) 
setDT(dM) 
acast(as.data.table(parsingDF)[dM, on = .(feat = Var1, var = value)], 
       feat ~ Var2, value.var = 'col') 
#  P1  P2  P3  P4  
#A "#B3E2CD" "#E41A1C" "#B3E2CD" "#B3E2CD" 
#B "#A6CEE3" "#FCCDE5" "#8DD3C7" "#FCCDE5" 
#C "#B3E2CD" "#E41A1C" "#A6CEE3" "#BC80BD" 
3

下面是使用功能從tidyverse的溶液。 clinDF2將是最終的輸出。

# Create example dataframes 
clinDF <- read.table(text = " P1 P2 P3 P4 
A M F M M 
        B H M L M 
        C 3 4 1 0", 
        header = TRUE, stringsAsFactors = FALSE) 

parsingDF <- read.table(text = "feat var col 
A  M '#B3E2CD' 
A  F '#E41A1C' 
B  H '#A6CEE3' 
B  M '#FCCDE5' 
B  L '#8DD3C7' 
C  0 '#BC80BD' 
C  1 '#A6CEE3' 
C  3 '#B3E2CD' 
C  4 '#E41A1C'", 
         header = TRUE, stringsAsFactors = FALSE) 

# Load packages 
library(tidyverse) 

# Process the data 
clinDF2 <- clinDF %>% 
    rownames_to_column("feat") %>% 
    gather(Group, var, -feat) %>% 
    left_join(parsingDF, by = c("feat", "var")) %>% 
    select(-var) %>% 
    spread(Group, col) %>% 
    remove_rownames() %>% 
    column_to_rownames("feat") 
+0

同樣可以包括在管道中的一切如果你做'...%>%傳播(組,列)%>%remove_rownames()%>%column_to_rownames('feat')' – Sotos

+0

@Sotos感謝您的更新。我將根據您的建議編輯我的答案。 – www