2012-11-15 6 views
19

私はファイルのリストを持っています。私もこれらのファイルの実際のファイル名から私がsubstr()の "名前"のリストを持っています。リストの各ファイルに新しい列を追加したいと思います。この列には、ファイル内の行数と「名前」の対応する要素が繰り返し含まれます。例えばテーブルまたはデータフレームのリスト内の各要素に新しい列を追加する

df1 <- data.frame(x = 1:3, y=letters[1:3]) 
df2 <- data.frame(x = 4:6, y=letters[4:6]) 
filelist <- list(df1,df2) 
ID <- c("1A","IB") 

擬似コード

for(i in length(filelist)){ 

     filelist[i]$SampleID <- rep(ID[i],nrow(filelist[i]) 

    } 

//基本的にファイル・リスト内のデータフレームの各々における新しい列を作成し、IDのrepeted対応する値を持つ列を埋める

私の出力は次のようになります:

filelist[1]は次のようになります。

x y SAmpleID 
1 1 a  1A 
2 2 b  1A 
3 3 c  1A 

fileList[2]

x y SampleID 
1 4 d  IB 
2 5 e  IB 
3 6 f  IB 

など.....

それを行うことができる方法任意のアイデア。

答えて

24

代替ソリューションはCBINDを使用することであり、そしてRは、短い値をrecylceするという事実を利用することベクター。

x <- df2 # from above 
cbind(x, NewColumn="Singleton") 
# x y NewColumn 
# 1 4 d Singleton 
# 2 5 e Singleton 
# 3 6 f Singleton 

についてはrepの使用のための必要はありません。 Rはあなたのためにそれを行います。

Therfore、あなたfor loopcbind(filelist[[i]], ID[[i]])を置くことができるか@Svenが指摘したように、あなたはクリーナーmapply使用することができます。

filelist <- mapply(cbind, filelist, "SampleID"=ID, SIMPLIFY=F) 
+4

ご協力いただきありがとうございます。 forループ、mapply()、cbindはすべて魅力的に機能します。このような言語を学ぶために、私はこのボードに質問をするたびに新しいことを学びます。すみません、感謝の気持ちを表明することはできませんでした。ありがとう – user1079898

16

これはあなたのループの修正版です:

  • 最終)は、体内のコマンドの後に行方不明になった:3つの問題がありました

    for(i in seq_along(filelist)){ 
    
        filelist[[i]]$SampleID <- rep(ID[i],nrow(filelist[[i]])) 
    
    } 
    

  • リストの要素は、[ではなく、[[によってアクセスされます。 [は長さ1のリストを返します。 [[は要素のみを返します。
  • length(filelist)は1つの値に過ぎないので、ループはリストの最後の要素に対してのみ実行されます。私はそれをseq_along(filelist)に置き換えました。

より効率的なアプローチは、タスクのmapplyを使用することである。

mapply(function(x, y) "[<-"(x, "SampleID", value = y) , 
     filelist, ID, SIMPLIFY = FALSE) 
+12

あなたは本当に匿名を必要といけないし'mapply'の機能です。 '' mapply( '' [< - '、filelist、 'sampleID'、value = ID、SIMPLIFY = FALSE)' 'は動作します – mnel

+0

@mnel +1素晴らしいアイデアです。 –

+0

あなたの答えも受け入れました。私はあなたが2つの答えを受け入れることができると思った。申し訳ありませんが、どうかあなたを怒らせるわけではありません。実際、forループは素晴らしく、説明が最も役立ちました。どうもありがとうございます! – user1079898

1

トリッキーな方法:

library(plyr) 

names(filelist) <- ID 
result <- ldply(filelist, data.frame) 
関連する問題