1

リスト内に 28 個のリストがあり、ID という別の変数を個々のリストに追加しようとしています。このデータフレームをリストで見つけました。データフレームの名前を持つ新しい変数を追加すると、非常に役立ちます。しかし、彼のコードを試してみると、私の場合はうまくいきません。私のリストには、コードが認識できる明確なラベル[1]、[2]、[3]などがないためだと思います。

all$id <- rep(names(mylist), sapply(mylist, nrow))


>List of 1
$ :List of 28

  ..$ :'data.frame':    271 obs. of  12 variables:


  .. ..$ Sample_ID                 : Factor w/ 271 levels "MC25",..: 19 27 2

  .. ..$ Reported_Analyte          : Factor w/ 10 levels "2-Butoxyethanol",..: 7 7 7 

 ..$ Date_Collected            : Factor w/ 71 levels "2010-05-08","2010-05-09",..: 8 9 1

  .. ..$ Result2                   : num [1:271] 0.11 0.11 0.11 0.11 

  ..$ :'data.frame':    6 obs. of  12 variables:


  .. ..$ Sample_ID                 : Factor w/ 271 levels "MC25",..: 19 27 2

  .. ..$ Reported_Analyte          : Factor w/ 10 levels "2-Butoxyethanol",..: 7 7 7 

 ..$ Date_Collected            : Factor w/ 71 levels "2010-05-08","2010-05-09",..: 8 9 1

  .. ..$ Result2                   : num [1:271] 0.11 0.11 0.11 0.11 
4

2 に答える 2

3

からのサンプルを含むリストの構築例を使用して、これに答えますmtcars

まず、データ フレームのリストを作成します。mtcarsこれを行うには、リストの要素ごとにから 10 行をサンプリングします。

ml <- lapply(1:3, function(x)mtcars[sample(1:32, 10), 1:3])

これで、3 つのデータ フレームの名前のないリストができました。次にid列を追加します。トリックは、 を使用lapplyして一連のリスト項目を使用しseq_along(ml)、次にcbind各データ フレームに ID を使用することです。

ml2 <- lapply(seq_along(ml), function(x)cbind(ml[[x]], id=x))

結果はあなたが必要としたものです:

str(ml2)
List of 3
 $ :'data.frame':   10 obs. of  4 variables:
  ..$ mpg : num [1:10] 15 24.4 26 15.8 22.8 21 32.4 17.3 17.8 30.4
  ..$ cyl : num [1:10] 8 4 4 8 4 6 4 8 6 4
  ..$ disp: num [1:10] 301 147 120 351 108 ...
  ..$ id  : int [1:10] 1 1 1 1 1 1 1 1 1 1
 $ :'data.frame':   10 obs. of  4 variables:
  ..$ mpg : num [1:10] 33.9 19.2 24.4 10.4 30.4 22.8 16.4 21.4 15.5 21.5
  ..$ cyl : num [1:10] 4 6 4 8 4 4 8 6 8 4
  ..$ disp: num [1:10] 71.1 167.6 146.7 460 75.7 ...
  ..$ id  : int [1:10] 2 2 2 2 2 2 2 2 2 2
 $ :'data.frame':   10 obs. of  4 variables:
  ..$ mpg : num [1:10] 15.5 21 13.3 21.5 21.4 30.4 21 18.1 30.4 15.2
  ..$ cyl : num [1:10] 8 6 8 4 4 4 6 6 4 8
  ..$ disp: num [1:10] 318 160 350 120 121 ...
  ..$ id  : int [1:10] 3 3 3 3 3 3 3 3 3 3
于 2012-05-02T07:24:52.327 に答える
3

あなたが達成したいことは本当に明確ではありません(あなたがリンクした投稿は、データフレームのリストを折りたたんで、折りたたまれたデータフレームの各行がどの元のデータフレームから来たかを示すID変数を折りたたんだバージョンに追加することについてでした)。

あなたのデータには問題があります。リスト内に 28 個のデータ フレームのリストがあります。あなたのQで与えられた出力を見ることがstr()できます.このサンプルデータセットでこれをよりよく見ることができます(ここではすべてのデータフレームは同じですが、それは便宜上のものです)

set.seed(42)
dat <- data.frame(Sample_ID = factor(sample(10)),
                  Reported_Analyte = factor(sample(LETTERS, 10)),
                  Date_Collected = Sys.Date() + 0:9,
                  Result2 = rnorm(10))

mylist <- list(lapply(1:28, function(x) dat))

mylist使用法を見るstr()と、私が言及した合併症の性質がわかります。

R> str(mylist, max = 2)
List of 1
 $ :List of 28
  ..$ Data_frame_ 1 :'data.frame':  10 obs. of  4 variables:
  ..$ Data_frame_ 2 :'data.frame':  10 obs. of  4 variables:
  ..$ Data_frame_ 3 :'data.frame':  10 obs. of  4 variables:
  ..$ Data_frame_ 4 :'data.frame':  10 obs. of  4 variables:
  ..$ Data_frame_ 5 :'data.frame':  10 obs. of  4 variables:
  ..$ Data_frame_ 6 :'data.frame':  10 obs. of  4 variables:
  ..$ Data_frame_ 7 :'data.frame':  10 obs. of  4 variables:
....<etc>

リンク先の投稿が開始された場所は、外側のリストのリストであり、そのリストには名前付きのコンポーネントがありました。外側のリストが必要ない場合は、この段階で破棄することをお勧めします。

mylist2 <- mylist[[1]]
## the `[[` are important as we want the 1st component *inside* the list
## using `[` would just give us a list within a list again.

その後、このリストに名前を追加できます

names(mylist2) <- paste("Data_frame_", seq_along(mylist2), sep = "")

その結果、

R> str(mylist2)
List of 28
 $ Data_frame_1 :'data.frame':  10 obs. of  4 variables:
  ..$ Sample_ID       : Factor w/ 10 levels "1","2","3","4",..: 10 9 3 6 4 8 5 1 2 7
  ..$ Reported_Analyte: Factor w/ 10 levels "C","F","I","J",..: 6 7 10 2 5 8 9 1 3 4
  ..$ Date_Collected  : Date[1:10], format: "2012-05-02" "2012-05-03" ...
  ..$ Result2         : num [1:10] 1.305 2.287 -1.389 -0.279 -0.133 ...
 $ Data_frame_2 :'data.frame':  10 obs. of  4 variables:
  ..$ Sample_ID       : Factor w/ 10 levels "1","2","3","4",..: 10 9 3 6 4 8 5 1 2 7
  ..$ Reported_Analyte: Factor w/ 10 levels "C","F","I","J",..: 6 7 10 2 5 8 9 1 3 4
  ..$ Date_Collected  : Date[1:10], format: "2012-05-02" "2012-05-03" ...
  ..$ Result2         : num [1:10] 1.305 2.287 -1.389 -0.279 -0.133 ...
....<etc>

List of 1が報告されなくなったことに注意してください。

リスト内のデータ フレームのリストが重要な場合 (理由はわかりませんが、問題ありません)、名前を[[1]]st コンポーネントに直接割り当てることができます。

names(mylist[[1]]) <- paste("Data_frame_", seq_along(mylist[[1]]), sep = "")

(オリジナルを使用していることに注意してください。mylistどちらの場合も、そのリストに を付けてい[[1]]ます。)

リスト構造内のリストは保持されますが、結果は上記と同様です。

R> str(mylist)
List of 1
 $ :List of 28
  ..$ Data_frame_1 :'data.frame':   10 obs. of  4 variables:
  .. ..$ Sample_ID       : Factor w/ 10 levels "1","2","3","4",..: 10 9 3 6 4 8 5 1 2 7
  .. ..$ Reported_Analyte: Factor w/ 10 levels "C","F","I","J",..: 6 7 10 2 5 8 9 1 3 4
  .. ..$ Date_Collected  : Date[1:10], format: "2012-05-02" "2012-05-03" ...
  .. ..$ Result2         : num [1:10] 1.305 2.287 -1.389 -0.279 -0.133 ...
  ..$ Data_frame_2 :'data.frame':   10 obs. of  4 variables:
  .. ..$ Sample_ID       : Factor w/ 10 levels "1","2","3","4",..: 10 9 3 6 4 8 5 1 2 7
  .. ..$ Reported_Analyte: Factor w/ 10 levels "C","F","I","J",..: 6 7 10 2 5 8 9 1 3 4
  .. ..$ Date_Collected  : Date[1:10], format: "2012-05-02" "2012-05-03" ...
  .. ..$ Result2         : num [1:10] 1.305 2.287 -1.389 -0.279 -0.133 ...
....<etc>

個々のデータ フレームを 1 つのデータ フレームに折りたたみ、元のデータ フレームに関する情報を保持したい場合は、次のようにしますmylist2

all2 <- do.call("rbind", mylist2)
all2 <- transform(all2, id = rep(names(mylist2), sapply(mylist2, nrow)))
rownames(all2) <- seq_len(nrow(all2)) ## reset rownames for compactness

与える:

R> head(all2)
  Sample_ID Reported_Analyte Date_Collected    Result2           id
1        10                L     2012-05-02  1.3048697 Data_frame_1
2         9                R     2012-05-03  2.2866454 Data_frame_1
3         3                W     2012-05-04 -1.3888607 Data_frame_1
4         6                F     2012-05-05 -0.2787888 Data_frame_1
5         4                K     2012-05-06 -0.1333213 Data_frame_1
6         8                T     2012-05-07  0.6359504 Data_frame_1

mylist非常によく似たものを使用しますが、次のようにインデックスを付けるmylistだけです[[1]]

all1 <- do.call("rbind", mylist[[1]])
all1 <- transform(all1, id = rep(names(mylist[[1]]), sapply(mylist[[1]], nrow)))
rownames(all1) <- seq_len(nrow(all1)) ## reset rownames for compactness

R> head(all1)
  Sample_ID Reported_Analyte Date_Collected    Result2           id
1        10                L     2012-05-02  1.3048697 Data_frame_1
2         9                R     2012-05-03  2.2866454 Data_frame_1
3         3                W     2012-05-04 -1.3888607 Data_frame_1
4         6                F     2012-05-05 -0.2787888 Data_frame_1
5         4                K     2012-05-06 -0.1333213 Data_frame_1
6         8                T     2012-05-07  0.6359504 Data_frame_1

mylist[[1]]ご覧のとおり、外側のリストが必要ない場合は、データ フレームのリストを繰り返し参照する必要がありません。

アップデート:

リストを 1 つのデータ フレームにまとめたくない場合は、@Andrie の回答を参照してください。ただし、次のように変更してください。

ml2 <- ml1
ml2[[1]] <- lapply(seq_along(ml[[1]]), function(x)cbind(ml[[1]][[x]], id=x))

したがって、リスト構造内のリストを説明します。

于 2012-05-02T07:30:59.243 に答える