2017-06-22 22 views
1

R.だが、言ってみましょうを通じて、私は、私は別のものに基づいて更新する必要がデータフレーム「clinDF」、「parsingDF」を持っている:別のデータフレームに基づくデータフレームの解析? (セルごと?)

#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内のすべてのを変更しません。 2つのループを使用して行単位と列単位で列を読み取るよりも、これを行うより良い方法はありますか?

たちはdata.tableでこれを行うことができ、事前

+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

でいただきありがとうございます。両方のデータセットが行列であるため、(setDT/as.data.table)に変換し、データセットの 'feat/var' 'Var1/value'列をonに結合し、 'wide'に戻します。melt ' 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

からacastとフォーマットはここ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

推測同じになりますあなたが '...%>%spread(Group、col)%>%remove_rownames()%>%column_to_rownames( 'feat')' – Sotos

+0

@Sotos更新をありがとう。私はあなたの提案に基づいて私の答えを編集します。 – www

関連する問題