2016-07-06 60 views
-1

私はフィルタリングしたいデータフレームを5つ扱っています(正規表現と一致する場合はいくつかの行を削除します)。すべてのデータフレームは同じ変数名で似ているので、それらをリストに格納して、それを繰り返しています。しかし、元のデータフレームごとにフィルタリングされたデータを保存したい場合、dfName_filteredの代わりにi_filteredを作成するので、ループが実行されるたびに上書きされます。 は、ここで私はループの中で持っているものです:私が言ったように、フィルタ1及びフィルタ2は、ちょうど私がCHR列のデータをフィルタリングするために使用していることをregexでいるRループでデータフレームを作成して名前を付けよう

for (i in list_all){ 
    i_filtered1 <- i[i$chr != filter1,] 
    i_filtered2 <- i[i$chr != filter2,] 
    #Write the result filtered table in a csv file 
    #Change output directory if needed 
    write.csv(i_filtered2, file="/home/tama/Desktop/i_filtered.csv") 
} 

。 元の名前+「_filtered」を新しいデータフレームに割り当てる正しい方法は何ですか?各データフレームは、これらの変数を持っている(ただし、値は変更することができます)

chr  start end length 
chr1 10400 10669 270 
chr10 237646 237836 191 
chrX 713884 714414 531 
chrUn 713884 714414 531 
chr1 762664 763174 511 
chr4 805008 805571 564 

そして私は、リスト内のすべてのそれらを格納している :

list_all <- list(heep, oe, st20_n, st20_t,all) 
list_all <- lapply(list_all, na.omit) 
情報を追加するには、事前

編集中

感謝

フィルタ:

#Get rid of random chromosomes 
filter1=".*random" 
#Get rid of undefined chromosomes 
filter2 = "ĉhrUn.* 

私が探している出力は次のとおりです。

heep_filtered1 
heep_filtered2 
oe_filtered1 
oe_filtered2 
etc 
+0

最小限の再現可能な例を追加します。 – Alex

+1

[データフレームの一覧を使用する](http://stackoverflow.com/a/24376207/903061) – Gregor

+0

@Alex、詳細情報を追加しました。 –

答えて

2

一つの可能​​性は、インデックス(または名前)の配列を反復することではなく、データフレーム自体のリストの上に、及びデータへのアクセスフレームをインデックスを使用します。

もう1つの問題は、!=演算子が正規表現をサポートしていないことです。正確なリテラルマッチだけです。代わりにgrepl()を使用する必要があります。

names(list_all) <- c("heep", "oe", "st20_n", "st20_t", "all") 

filtered <- NULL 
for (i in names(list_all)){ 
    df <- list_all[[i]] 
    df.1 <- df[!grepl(filter1, df$chr), ] 
    df.2 <- df[!grepl(filter2, df$chr), ] 
    #Write the result filtered table in a csv file 
    #Change output directory if needed 
    write.csv(df.2, file=paste0("/home/tama/Desktop/", i, "_filtered.csv")) 
    filtered[[paste0(i, "_filtered", 1)]] <- df.1 
    filtered[[paste0(i, "_filtered", 2)]] <- df.2 
} 

結果は、フィルタリングされたデータフレームを含むfilteredというリストです。

+0

返信いただきありがとうございます。私は詳細を追加しました。 –

+0

@TamaraDominguezPoncelas私は答えを広げました。 –

+0

アーネストに感謝します。正規表現を修正する必要があります。なぜなら、彼らは私が欲しいものをやっていないからです。しかし、このコードは正しく反復して新しいdfとファイルを作成します。 –

1

iは、単独でのみ解釈されるという問題があります。あなたは他の名前の一部として、そして現在のバージョンの文字としてそれを使用しています。

forループの代わりにlapplyを使用することをお勧めします。 - これにより、さらにフィルタを追加することも容易になります)。

filters <- c(".*random", "chrUn.*") 
list_all <- list(heep = heep 
       , oe = oe 
       , st20_n = st20_n 
       , st20_t = st20_t 
       , all = all) 
toLoop <- names(list_all) 
names(toLoop) <- toLoop # renames them in the output list 


filtered <- lapply(toLoop, function(thisSet)){ 
    tempFiltered <- list_all[[thisSet]][!(list_all[[thisSet]]$chr %in% filters),] 
    #Write the result filtered table in a csv file 
    #Change output directory if needed 
    write.csv(tempFiltered, file=paste0("/home/tama/Desktop/",thisSet,"_filtered.csv")) 

    # Return the part you care about 
    return(tempFiltered) 
} 
+0

ありがとうMark、私はこれを試しましたが、何らかの理由で新しいCSVファイルを保存しません。 –

関連する問題