将数字向量列表转换为数据帧并按顺序写入数字

时间:2016-05-31 06:17:17

标签: r list dataframe rbind

如何将列表列表转换为保留列表名称的单个数据框,然后添加序列号。

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)

但是我的工作方式并不像我想要的那样......

1 个答案:

答案 0 :(得分:4)

我们可以使用data.table。循环遍历list,转换为data.frame,使用rbindlist垂直绑定list中的data.frames(选项idcol=TRUE,确保单独的列是基于names的{​​{1}}创建的。我们可以使用list中的rlebase 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 })将lapplybind_rows'ID'列指定为两个。

.id