2014-10-20 108 views
2

Hiiii,我一直在整個週末都在處理這個問題。我試圖做一個簡單的查找,但我的查找表有不同數量的每個查找鍵的數據。使用R中的查找表對數據進行計數

比方說,我有兩個表: 表1:(有數據的一些額外列,但無關我的問題) 表1:(3行樣品)

GeneName 
col1  col2 
HGGR  .554444 
BRAC4  .333222 
FAM34  .111222 

我的查找表是表基因組,然後是它們各自的基因。根據基因組中有多少基因,查找表可以有不同數量的列...這是一個小例子,該表通常每組有20-30個基因... 表2 :(2行的示例)

GeneGroupName 
col1    col2  col3 
CHR1_45000_46000 HGGR  BRAC4 
CHR1_67000_70000 FAM34 

我想要的是Table1中的另一列,它顯示了相應的基因組!

FinalResultTable 

    col1    col2  col3 
    CHR1_45000_46000 HGGR  .554444 
    CHR1_45000_46000 BRAC4  .333222 
    CHR1_67000_70000 FAM34  .111222 

我到目前爲止的代碼是:

finalresult<-cbind(gene_group[match(table1[,1], gene_group[,2]),1], table1) 

當然,這僅適用於在基因組表的第2列中發現的基因,但!我需要它來搜索整個表並返回行號....

任何幫助嗎?在此先感謝

大衛

回答

1

一種方法是將表2轉換爲長格式,具有GeneGroupName的列和成員基因的單個列,並且然後使用match

(table1 <- data.frame(GeneName=sample(LETTERS[1:12]), col2=runif(12))) 

# GeneName  col2 
# 1   F 0.6116285 
# 2   L 0.5752088 
# 3   J 0.7499011 
# 4   D 0.9405068 
# 5   A 0.9360968 
# 6   K 0.6549850 
# 7   I 0.7070163 
# 8   E 0.3521952 
# 9   C 0.4234293 
# 10  G 0.7750203 
# 11  B 0.1418680 
# 12  H 0.6632382 

(table2 <- data.frame(GeneGroupName=1:4, g1=LETTERS[1:4], g2=LETTERS[5:8], 
         g3=LETTERS[9:12])) 

# GeneGroupName g1 g2 g3 
# 1    1 A E I 
# 2    2 B F J 
# 3    3 C G K 
# 4    4 D H L 

(table2.long <- reshape(table2, direction='long', varying=list(-1), timevar='gene')) 

#  GeneGroupName gene g1 id 
# 1.1    1 1 A 1 
# 2.1    2 1 B 2 
# 3.1    3 1 C 3 
# 4.1    4 1 D 4 
# 1.2    1 2 E 1 
# 2.2    2 2 F 2 
# 3.2    3 2 G 3 
# 4.2    4 2 H 4 
# 1.3    1 3 I 1 
# 2.3    2 3 J 2 
# 3.3    3 3 K 3 
# 4.3    4 3 L 4 

table1$grp <- table2.long$GeneGroupName[match(table1$GeneName, 
               table2.long$g1)] 

table1 

# GeneName  col2 GeneGroupName 
# 1   F 0.6116285    2 
# 2   L 0.5752088    4 
# 3   J 0.7499011    2 
# 4   D 0.9405068    4 
# 5   A 0.9360968    1 
# 6   K 0.6549850    3 
# 7   I 0.7070163    1 
# 8   E 0.3521952    1 
# 9   C 0.4234293    3 
# 10  G 0.7750203    3 
# 11  B 0.1418680    2 
# 12  H 0.6632382    4 
1

在解決方案可能是使用data.table包。 再現原子例如:

table1 = data.table(col1=c("HGGR","BRAC4","FAM34"),col2=c(.55,.33,.11)) 
table2 = data.table(col2=c("HGGR","FAM34"),col1=c("CHR1_45000_46000", "CHR1_67000_70000"), col3=c("BRAC4",NA)) 

# > table1 
#  col1 col2 
# 1: BRAC4 0.33 
# 2: FAM34 0.11 
# 3: HGGR 0.55 

# > table2 
#  col2    col1 col3 
# 1: HGGR CHR1_45000_46000 BRAC4 
# 2: FAM34 CHR1_67000_70000 NA 

先處理第二data.table合併col2col3melt

table2=melt(table2, id=c("col1"), value.name="col2", na.rm=TRUE) 
table2[,variable:=NULL] 

然後合併兩個data.table得到想要的結果:

setkey(table1, col1) 
setkey(table2, col2) 
table2[table1] 

# col2 col1    col2.1 
# BRAC4 CHR1_45000_46000 0.33 
# FAM34 CHR1_67000_70000 0.11 
# HGGR CHR1_45000_46000 0.55 
0

Modying @ jbaums的樣本數據的位(在表2中加入NA),這裏是與dplyrtidyr一種方式。

table1 <- data.frame(GeneName=sample(LETTERS[1:12]), col2=runif(12), 
      stringsAsFactors = FALSE) 

table2 <- data.frame(GeneGroupName=1:4, g1=LETTERS[1:4], g2=LETTERS[5:8], 
      g3=c(LETTERS[9:11], NA), stringsAsFactors = FALSE) 


table2 %>% 
    gather(gene, whatever, - GeneGroupName) %>% 
    left_join(., table1, by = c("whatever" = "GeneName")) %>% 
    select(-gene, GeneGroupName, gene = whatever, value = col2) 


# GeneGroupName gene  value 
#1    1 A 0.9926841 
#2    2 B 0.3531973 
#3    3 C 0.6547239 
#4    4 D 0.4781180 
#5    1 E 0.1293723 
#6    2 F 0.6334933 
#7    3 G 0.2132081 
#8    4 H 0.5987610 
#9    1 I 0.7317925 
#10    2 J 0.9761707 
#11    3 K 0.9240745 
#12    4 <NA>  NA 
相關問題