真的不是很清楚你想要实现什么(你链接到的帖子是关于折叠数据框列表并在折叠版本中添加一个 ID 变量,指示折叠数据框中每行来自哪个原始数据框)。
我发现您的数据很复杂;您有一个列表中包含 28 个数据框的列表。您可以str()在 Q 中给出的输出中看到这一点。您可以使用这个示例数据集更好地看到这一点(这里所有的数据框都是相同的,但这只是为了方便)
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>
如果您现在希望继续将各个数据框折叠成一个数据框,但保留有关它们来自哪个数据框的信息,我们将这样做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我们使用非常相似的东西,但只是索引mylistusing [[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]]正如您所看到的,如果您不需要外部列表,则必须反复引用您的数据框列表是很痛苦的。
更新:
如果您不想将列表折叠成单个数据框,请参阅@Andrie 的答案,但将其修改为:
ml2 <- ml1
ml2[[1]] <- lapply(seq_along(ml[[1]]), function(x)cbind(ml[[1]][[x]], id=x))
所以你在列表结构中考虑了列表。