2017-06-22 30 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