56

ファイルのリストがあります。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])

  }

// 基本的に、filelist の各データフレームに新しい列を作成し、その列に対応する ID の繰り返し値を入力します

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

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

等々.....

それがどのように行われるかについてのアイデア。

4

6 に答える 6

65

別の解決策は、cbind を使用し、R が短いベクトルの値をリサイクルするという事実を利用することです。

例えば

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 がそれを行います。

@Sven が指摘したように、クリーナーを使用できcbind(filelist[[i]], ID[[i]])ます。for loopmapply

filelist <- mapply(cbind, filelist, "SampleID"=ID, SIMPLIFY=F)
于 2012-11-15T22:30:29.327 に答える
24

これはループの修正版です。

for( i in seq_along(filelist)){

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

}

3つの問題がありました:

  • )本体のコマンドの後に決勝がありませんでした。
  • リストの要素は[[、 ではなく によってアクセスされ[ます。[長さ 1 のリストを返します。[[要素のみを返します。
  • length(filelist)は 1 つの値にすぎないため、ループはリストの最後の要素に対してのみ実行されます。と交換しましたseq_along(filelist)

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

mapply(function(x, y) "[<-"(x, "SampleID", value = y) ,
       filelist, ID, SIMPLIFY = FALSE)
于 2012-11-15T19:51:53.180 に答える
3

トリッキーな方法:

library(plyr)

names(filelist) <- ID
result <- ldply(filelist, data.frame)
于 2017-04-02T20:59:26.903 に答える