在 R 中使用数据框制作嵌套列表
Making a nested list with a dataframe in R
所以我的数据框中有 5 列:
ID pos strand nucleotide count
id1 12 + A 13
id1 13 + C 25
id2 24 + G 10
id2 25 + T 25
id2 26 + A 10
id3 10 + C 5
我正在尝试制作这样的列表或字典:
mylist <- [[id1,[[id1,12,+,A,13],[id1,13,+,C,25]]],
[id2,[[id2,24,+,G,10],[id2,25,+,T,25],[id2,26,+,A,10]]],
[id3,[[id3,10,+,C,5]]]
所以基本上,它是一个列表列表(有两个元素,一个是id名称,另一个是行列表,每一行也应该是一个列表)。
我试过下面这段代码:
myl = list()
for (i in seq(nrow(res))) {
myl[[i]] <- unclass(res[i,])
}
但它只给我行列表,而不是按 id 分组。
我也尝试过使用 df_to_nest:
nestedlist = df_to_nest(data.table(dat), as.vector("seqnames"), count_col = NULL, value_cols = c('pos', 'strand', 'nucleotide', 'count'))
但是它只有名称,没有任何元素。
还有什么我可以尝试的吗?
str(data)
的输出:
'data.frame': 7 obs. of 5 variables:
$ seqnames : Factor w/ 3138 levels "id1","id2",..: 322 322 330 330 330 994 994
$ pos : int 2805 2806 5066 5067 5068 3348 3349
$ strand : Factor w/ 3 levels "+","-","*": 2 2 1 1 1 2 1
$ nucleotide: Factor w/ 8 levels "A","C","G","T",..: 1 4 3 3 3 1 1
$ count : int 1 1 1 1 1 97 101
我有一个非常大的数据框,这里我只选择了具有 3 个不同 ID 名称的 7 行。
像这样的东西应该可以工作:
data <- read.table(header = TRUE, text = "
ID pos strand nucleotide count
id1 12 + A 13
id1 13 + C 25
id2 24 + G 10
id2 25 + T 25
id2 26 + A 10
id3 10 + C 5
")
l <- split(unname(split(data, seq_len(nrow(data)))), data$ID)
ll <- Map(list, names(l), l)
ll
## $id1
## $id1[[1]]
## [1] "id1"
##
## $id1[[2]]
## $id1[[2]][[1]]
## ID pos strand nucleotide count
## 1 id1 12 + A 13
##
## $id1[[2]][[2]]
## ID pos strand nucleotide count
## 2 id1 13 + C 25
##
##
##
## $id2
## $id2[[1]]
## [1] "id2"
##
## $id2[[2]]
## $id2[[2]][[1]]
## ID pos strand nucleotide count
## 3 id2 24 + G 10
##
## $id2[[2]][[2]]
## ID pos strand nucleotide count
## 4 id2 25 + T 25
##
## $id2[[2]][[3]]
## ID pos strand nucleotide count
## 5 id2 26 + A 10
##
##
##
## $id3
## $id3[[1]]
## [1] "id3"
##
## $id3[[2]]
## $id3[[2]][[1]]
## ID pos strand nucleotide count
## 6 id3 10 + C 5
此处,ll
是形式为
的 2 元素列表的命名列表
list(<ID>, <list of 1-row data frames>)
随心所欲。但是,使用 l
而不是 ll
作为您的“词典”会更自然,因为这样您就可以(比如说)l$id1
来检索 [= 的列表16=] 行,而不是 ll$id1[[2L]]
。 ll$id1[[1L]]
完全多余,因为ll
的names
属性已经指定了每个ID的位置
所以我的数据框中有 5 列:
ID pos strand nucleotide count
id1 12 + A 13
id1 13 + C 25
id2 24 + G 10
id2 25 + T 25
id2 26 + A 10
id3 10 + C 5
我正在尝试制作这样的列表或字典:
mylist <- [[id1,[[id1,12,+,A,13],[id1,13,+,C,25]]],
[id2,[[id2,24,+,G,10],[id2,25,+,T,25],[id2,26,+,A,10]]],
[id3,[[id3,10,+,C,5]]]
所以基本上,它是一个列表列表(有两个元素,一个是id名称,另一个是行列表,每一行也应该是一个列表)。
我试过下面这段代码:
myl = list()
for (i in seq(nrow(res))) {
myl[[i]] <- unclass(res[i,])
}
但它只给我行列表,而不是按 id 分组。 我也尝试过使用 df_to_nest:
nestedlist = df_to_nest(data.table(dat), as.vector("seqnames"), count_col = NULL, value_cols = c('pos', 'strand', 'nucleotide', 'count'))
但是它只有名称,没有任何元素。
还有什么我可以尝试的吗?
str(data)
的输出:
'data.frame': 7 obs. of 5 variables:
$ seqnames : Factor w/ 3138 levels "id1","id2",..: 322 322 330 330 330 994 994
$ pos : int 2805 2806 5066 5067 5068 3348 3349
$ strand : Factor w/ 3 levels "+","-","*": 2 2 1 1 1 2 1
$ nucleotide: Factor w/ 8 levels "A","C","G","T",..: 1 4 3 3 3 1 1
$ count : int 1 1 1 1 1 97 101
我有一个非常大的数据框,这里我只选择了具有 3 个不同 ID 名称的 7 行。
像这样的东西应该可以工作:
data <- read.table(header = TRUE, text = "
ID pos strand nucleotide count
id1 12 + A 13
id1 13 + C 25
id2 24 + G 10
id2 25 + T 25
id2 26 + A 10
id3 10 + C 5
")
l <- split(unname(split(data, seq_len(nrow(data)))), data$ID)
ll <- Map(list, names(l), l)
ll
## $id1
## $id1[[1]]
## [1] "id1"
##
## $id1[[2]]
## $id1[[2]][[1]]
## ID pos strand nucleotide count
## 1 id1 12 + A 13
##
## $id1[[2]][[2]]
## ID pos strand nucleotide count
## 2 id1 13 + C 25
##
##
##
## $id2
## $id2[[1]]
## [1] "id2"
##
## $id2[[2]]
## $id2[[2]][[1]]
## ID pos strand nucleotide count
## 3 id2 24 + G 10
##
## $id2[[2]][[2]]
## ID pos strand nucleotide count
## 4 id2 25 + T 25
##
## $id2[[2]][[3]]
## ID pos strand nucleotide count
## 5 id2 26 + A 10
##
##
##
## $id3
## $id3[[1]]
## [1] "id3"
##
## $id3[[2]]
## $id3[[2]][[1]]
## ID pos strand nucleotide count
## 6 id3 10 + C 5
此处,ll
是形式为
list(<ID>, <list of 1-row data frames>)
随心所欲。但是,使用 l
而不是 ll
作为您的“词典”会更自然,因为这样您就可以(比如说)l$id1
来检索 [= 的列表16=] 行,而不是 ll$id1[[2L]]
。 ll$id1[[1L]]
完全多余,因为ll
的names
属性已经指定了每个ID的位置