在 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]]完全多余,因为llnames属性已经指定了每个ID的位置