如何将列表列表转换为保留列表名称的单个数据框,然后添加序列号。
str(data)给了我这个:
List of 230
$ data_1 : num [1:19, 1:2] 0.0204 0.0516 0.0924 0.1424 0.2044 ...
$ data_14 : num [1:19, 1:2] 0.006 0.0144 0.0272 0.0456 0.0712 ...
$ data_2 : num [1:19, 1:2] 0.0292 0.0736 0.1316 0.202 0.286 ...
$ data_27 : num [1:19, 1:2] 0.0056 0.0136 0.024 0.0384 0.0572 ...
$ data_46 : num [1:19, 1:2] 0.0164 0.0408 0.0716 0.11 0.1588 ...
$ data_510: num [1:19, 1:2] 0.0128 0.034 0.0652 0.1112 0.1756 ...
$ data_13 : num [1:19, 1:2] 0.0064 0.0136 0.022 0.0332 0.046 ...
$ data_19 : num [1:19, 1:2] 0.0036 0.0096 0.0224 0.0444 0.0776 ...
$ data_080: num [1:19, 1:2] 0.0056 0.0132 0.0228 0.0356 0.052 ...
$ data_15 : num [1:19, 1:2] 0.0028 0.0068 0.0116 0.0172 0.0244 ...
$ data_18 : num [1:19, 1:2] 0.0008 0.0012 0.0024 0.0032 0.0044 0.0064 0.0096 0.014 0.02 0.0268 ...
$ data_3 : num [1:19, 1:2] 0.0124 0.0308 0.0576 0.0932 0.1384 ...
$ data_33 : num [1:19, 1:2] 0.0036 0.0084 0.016 0.0252 0.0372 ...
$ data_500: num [1:19, 1:2] 0.004 0.0096 0.0196 0.0372 0.0648 ...
$ data_015 : num [1:19, 1:2] 0.0072 0.0172 0.03 0.0456 0.064 ...
$ data_02 : num [1:19, 1:2] 0.0132 0.0296 0.0484 0.0696 0.0936 ...
$ data_04 : num [1:19, 1:2] 0.0072 0.0192 0.038 0.0692 0.1132 ...
$ data_37 : num [1:19, 1:2] 0.0056 0.014 0.0252 0.0388 0.0552 ...
$ data_4 : num [1:19, 1:2] 0.0072 0.0188 0.0352 0.056 0.0812 ...
$ data_550 : num [1:19, 1:2] 0.004 0.0104 0.02 0.032 0.048 ...
......列表重复2到30次
我正在寻找的是这样的:
ID Area Size Interval
data_1 0.0204 0.1 1
data_1 0.0516 0.15 1
data_1 0.0924 0.2 1
data_1 0.1424 0.25 1
data_14 0.006 0.1 1
data_14 0.0144 0.15 1
data_14 0.0272 0.2 1
data_14 0.0456 0.25 1
data_1 0.0204 0.1 1
data_1 0.0516 0.15 1
data_1 0.0924 0.2 1
data_1 0.1424 0.25 1
data_14 0.006 0.1 1
data_14 0.0144 0.15 1
data_14 0.0272 0.2 1
data_14 0.0456 0.25 1
data_1 0.0254 0.1 2
data_1 0.0566 0.15 2
data_1 0.0974 0.2 2
data_1 0.1474 0.25 2
data_14 0.011 0.1 2
data_14 0.0194 0.15 2
data_14 0.0322 0.2 2
data_14 0.0506 0.25 2
data_1 0.0254 0.1 2
data_1 0.0566 0.15 2
data_1 0.0974 0.2 2
data_1 0.1474 0.25 2
data_14 0.011 0.1 2
data_14 0.0194 0.15 2
data_14 0.0322 0.2 2
data_14 0.0506 0.25 2
我尝试了lapply(data, data.frame)
和do.call(rbind.data.frame, data)
但是我的工作方式并不像我想要的那样......
答案 0 :(得分:4)
我们可以使用data.table
。循环遍历list
,转换为data.frame
,使用rbindlist
垂直绑定list
中的data.frames(选项idcol=TRUE
,确保单独的列是基于names
的{{1}}创建的。我们可以使用list
中的rle
和base R
来创建“重复”的“Seq”列。 id'不相邻的值。
ave
或者使用library(data.table)
rbindlist(lapply(data, as.data.frame), idcol=TRUE)[, Seq :=inverse.rle(within.list(rle(.id),
values <- ave(values, values, FUN=seq_along)))][]
,我们使用dplyr
进行垂直绑定,根据相邻的“ID”值是否相同来创建分组变量('grp')。
bind_rows
我们在上面的数据中选择了library(dplyr)
dM1 <- lapply(data, as.data.frame) %>%
bind_rows(., .id = "ID") %>%
mutate(grp = cumsum(ID!= lag(ID, default="999")))
行'ID'和'grp',按'ID'分组,创建一个unique
的序列列并执行row_number()
。< / p>
right_join
或者更简单的方法是按照dM1 %>%
select(ID, grp) %>%
unique() %>%
group_by(ID) %>%
mutate(Seq = row_number()) %>%
right_join(., dM1) %>%
select(-grp)
的{{1}}(即“数据”)对序列进行分组,将names
更改为list
具有原始名称的序列,通过使用names
循环paste
,将list
矩阵转换为list
data.frames,绑定行(list
})将lapply
和bind_rows
'ID'列指定为两个。
.id