2016-04-15 9 views
2

別のデータフレームの行に従って一部の列をサブセット化したいと考えています。そう2つのデータフレームは、以下の通りである:別のデータフレームの行に基づいて1つのデータフレームのサブセット列

df1 <- structure(list(ID = structure(c(3L, 1L, 2L, 5L, 4L), .Label = c("cg08", "cg09", "cg29", "cg36", "cg65"), class = "factor"), chr = c(16L, 3L, 3L, 1L, 8L), gene = c(534L, 376L, 171L, 911L, 422L), GS12 = c(0.15, 0.87, 0.6, 0.1, 0.72), GS32 = c(0.44, 0.93, 0.92, 0.07, 0.91),  GS56 = c(0.46, 0.92, 0.62, 0.06, 0.87), GS87 = c(0.79, 0.93,  0.86, 0.08, 0.88)), .Names = c("ID", "chr", "gene", "GS12", "GS32", "GS56", "GS87"), class = "data.frame", row.names = c("1", "2", "3", "4", "5")) 
df2 <- structure(list(samples = structure(c(1L, 2L, 4L, 3L, 6L, 5L), .Label = c("GS32", "GS33", "GS55", "GS56", "GS68", "GS87"), class = "factor"), ID2 = structure(c(1L, 6L, 3L, 4L, 5L, 2L), .Label = c("GM1", "GM10", "GM17", "GM18", "GM19", "GM7"), class = "factor")), .Names = c("samples", "ID2"), class = "data.frame", row.names = c(NA, -6L)) 

データ:

df1: 
      ID  chr gene GS12  GS32  GS56  GS87 
     1 cg29  16 534  0.15  0.44  0.46  0.79 
     2 cg08   3 376  0.87  0.93  0.92  0.93 
     3 cg09   3 171  0.60  0.92  0.62  0.86 
     4 cg65   1 911  0.10  0.07  0.06  0.08 
     5 cg36   8 422  0.72  0.91  0.87  0.88 
df2: 

samples ID2  
GS32 GM1   
GS33 GM7   
GS56 GM17   
GS55 GM18   
GS87 GM19   
GS68 GM10   
私が一般的である(最終的な出力のすべての行を維持しながら)DF1からすべての列をサブセット化したい

df2のID列は、要約すると、別のデータフレームの行に従って1つのデータフレームの列をサブセット化したいのですが、これを行う関数はありますか?

+2

期待どおりの結果ですか? – jogo

+2

'df1 $ {samples}' df2 $ samples'が 'factor'の場合' as.character(df2 $ samples) 'を使用してください。 – akrun

+1

私はdata.tableを見ていますパッケージと関数foverlaps。多分私に与えられたこの答えは、あなたを助けるでしょう: http://stackoverflow.com/questions/35719047/grouping-a-data-table-by-running-intervals – Phann

答えて

3

入力データは:あなたがチェックしている

df1[colnames(df1) %in% df2$samples] 
# GS32 GS56 GS87 
#1 0.44 0.46 0.79 
#2 0.93 0.92 0.93 
#3 0.92 0.62 0.86 
#4 0.07 0.06 0.08 
#5 0.91 0.87 0.88 

DF1から列名は、DF2のサンプルで発生した:

df1 <- structure(list(ID = structure(c(3L, 1L, 2L, 5L, 4L), .Label = c("cg08", "cg09", "cg29", "cg36", "cg65"), class = "factor"), chr = c(16L, 3L, 3L, 1L, 8L), gene = c(534L, 376L, 171L, 911L, 422L), GS12 = c(0.15, 0.87, 0.6, 0.1, 0.72), GS32 = c(0.44, 0.93, 0.92, 0.07, 0.91),  GS56 = c(0.46, 0.92, 0.62, 0.06, 0.87), GS87 = c(0.79, 0.93,  0.86, 0.08, 0.88)), .Names = c("ID", "chr", "gene", "GS12", "GS32", "GS56", "GS87"), class = "data.frame", row.names = c("1", "2", "3", "4", "5")) 
df2 <- structure(list(samples = structure(c(1L, 2L, 4L, 3L, 6L, 5L), .Label = c("GS32", "GS33", "GS55", "GS56", "GS68", "GS87"), class = "factor"), ID2 = structure(c(1L, 6L, 3L, 4L, 5L, 2L), .Label = c("GM1", "GM10", "GM17", "GM18", "GM19", "GM7"), class = "factor")), .Names = c("samples", "ID2"), class = "data.frame", row.names = c(NA, -6L)) 

私が何を求めていることは、次であると考えています。
は しかし、私はまた、あなたの出力データフレームでID、染色体や遺伝子を必要とし、これは次のように行うことができると仮定します。

df1[c(1:3, colnames(df1) %in% df2$samples)] 
# ID chr gene ID.1 ID.2 ID.3 
#1 cg29 16 534 cg29 cg29 cg29 
#2 cg08 3 376 cg08 cg08 cg08 
#3 cg09 3 171 cg09 cg09 cg09 
#4 cg65 1 911 cg65 cg65 cg65 
#5 cg36 8 422 cg36 cg36 cg36 

あなたがする列の順序を強制する場合以前と同じオーダーで、%in%の代わりにmatchを使用してください。 matchには少なくとも2つの変数が必要です。最初はターゲットベクトルで、次にソートする必要があるデータフレーム/ベクトルです。

df1[,c(1:3,na.omit(match(df2$samples, colnames(df1))))] 
# ID chr gene GS32 GS56 GS87 
#1 cg29 16 534 0.44 0.46 0.79 
#2 cg08 3 376 0.93 0.92 0.93 
#3 cg09 3 171 0.92 0.62 0.86 
#4 cg65 1 911 0.07 0.06 0.08 
#5 cg36 8 422 0.91 0.87 0.88 
関連する問題