rbindlist()
是一个便利函数,它可以从多个列表中创建一个 data.table。对于这种嵌套列表,需要递归地应用两次。
此外,它还有 idcol
参数,它在结果中创建一列,显示这些行来自哪个列表项。
library(data.table)
rbindlist(lapply(L, rbindlist, idcol = "es.type"), idcol = "id")
id es.type d SD
1: A Short 1 3
2: A Short 2 4
3: B Short 2 1
4: B Short 3 2
5: B Long1 7 6
6: B Long1 8 7
7: C Short 5 3
8: C Short 6 4
9: C Long1 8 1
10: C Long1 9 2
11: C Long2 4 6
12: C Long2 5 7
现在,OP要求id
是数字,并且Long1
和Long2
必须变成Long
。这可以通过对结果列进行后续操作来实现:
rbindlist(lapply(L, rbindlist, idcol = "es.type"), idcol = "id")[
, id := rleid(id)][
, es.type := sub("\\d+$", "", es.type)][]
id es.type d SD
1: 1 Short 1 3
2: 1 Short 2 4
3: 2 Short 2 1
4: 2 Short 3 2
5: 2 Long 7 6
6: 2 Long 8 7
7: 3 Short 5 3
8: 3 Short 6 4
9: 3 Long 8 1
10: 3 Long 9 2
11: 3 Long 4 6
12: 3 Long 5 7
在基本的R语言中,我们可以通过以下方式实现相同的效果:
do.call("rbind", lapply(L, do.call, what = "rbind"))
它返回
d SD
A.Short.1 1 3
A.Short.2 2 4
B.Short.1 2 1
B.Short.2 3 2
B.Long1.1 7 6
B.Long1.2 8 7
C.Short.1 5 3
C.Short.2 6 4
C.Long1.1 8 1
C.Long1.2 9 2
C.Long2.1 4 6
C.Long2.2 5 7
id
和es.type
可通过解析行名称获取,例如,
DF <- do.call("rbind", lapply(L, do.call, what = "rbind"))
id <- stringr::str_extract(row.names(DF), "^[^.]*")
DF$id <- c(1L, cumsum(head(id, -1L) != tail(id, -1L)) + 1L)
DF$es.type <- stringr::str_extract(row.names(DF), "(?<=\\.)[^.0-9]*")
row.names(DF) <- NULL
DF
d SD id es.type
1 1 3 1 Short
2 2 4 1 Short
3 2 1 2 Short
4 3 2 2 Short
5 7 6 2 Long
6 8 7 2 Long
7 5 3 3 Short
8 6 4 3 Short
9 8 1 3 Long
10 9 2 3 Long
11 4 6 3 Long
12 5 7 3 Long
do.call(rbind, Map(cbind, lapply(L, function(dat) do.call(rbind, Map(cbind, dat, es.type = names(dat)))), id = seq_along(L)))
。 - akrunes.type
下,Long1
和Long2
必须只是Long
。 - rnorouziando.call(rbind, c(Map(...., list(make.row.names = FALSE)))
。 - akrunplot(table(D$time), col = g)
非常简洁 :=) - akrundo.call(rbind, Filter(Negate(is.null), Map(cbind, lapply(L, function(x) do.call(rbind, x)), id = seq_along(L))))
。 - akrun