2016-04-12 8 views
1

大きなデータセットがあり、結果をループしてリスト内の列を減算し、新しい列の各行の結果を出力したい。リストから列を減算することによってデータフレームに新しい列を追加する

ref1 <- samples Controls 
     E_2334188 E_2334207 
     E_2334202 E_2334221 

df1 <- 
     Chr Start End Feature   E_2334188 E_2334202 E_2334207 E_2334221 
     1 740001 760000 1:740001-760000 1.6832013 0.8346011 -0.23045394 1.5974912 
     1 760001 780000 1:760001-780000 -0.3231613 -1.8504905 0.13668752 -0.38662600 
     1 780001 800000 1:780001-800000 -0.3936060 -2.2163153 -0.15266541 -0.60706691 



ind <- which(names(df1) %in% ref1$samples) 
rnd <- which(names(df1) %in% ref1$controls) 

    df2 <- df1[,c(1:4)] 
    df2$newcol <- 0 

    for (i in 1:nrow(ref1)){ 
     n <- df1[ind]-df1[rnd] 
     df2$newcol[i] <- n 
    } 

期待結果

df2 <- 


     Chr Start End Feature   E_2334188 E_2334202 
      1 740001 760000 1:740001-760000 1.913655 -0.7628901 
      1 760001 780000 1:760001-780000 -0.4598488 -1.463865 
      1 780001 800000 1:780001-800000 -0.2409406 -1.609248 

答えて

1

我々は、「サンプル」と「コントロール」の要素に基づいて、「DF1を」サブセットそれらを引き、そして「DF1」の最初の4列のcbindができます。

cbind(df1[1:4],df1[ref1$samples]- df1[ref1$Controls]) 
# Chr Start End   Feature E_2334188 E_2334202 
#1 1 740001 760000 1:740001-760000 1.9136552 -0.7628901 
#2 1 760001 780000 1:760001-780000 -0.4598488 -1.4638645 
#3 1 780001 800000 1:780001-800000 -0.2409406 -1.6092484 

注:「サンプル」と「コントロールズの列がfactorクラスであれば、characterに変換し、同じアプローチを使用します。

cbind(df1[1:4],df1[as.character(ref1$samples)]- df1[as.character(ref1$Controls)]) 
+0

私は大きなデータセットを持っています。理解しやすくするために、74列でデータをサブセット化する – beginner

+0

@beginnerそれは本当に問題ではありません。 'samples'と 'control's from' ref1 'に列名がある場合、これは基本的に対応する列を' df1 'からサブセット化し、等しいサイズのデータ​​セットを減算します。 – akrun

+0

@beginnerここでは、 'ref1'の同じ行(列名)の列を減算する必要があると仮定しています。 – akrun

関連する問題