创建宽(非汇总)R data.table
我有一个紧凑的data.frame或data.table,其中包含关于范围的行信息(dt.compact) 现在,我想要一种简单的方法来生成宽data.frame或表,每个位置有一行。输出应如下所示:创建宽(非汇总)R data.table,r,data.table,R,Data.table,我有一个紧凑的data.frame或data.table,其中包含关于范围的行信息(dt.compact) 现在,我想要一种简单的方法来生成宽data.frame或表,每个位置有一行。输出应如下所示: # Output do.call(data.table, list(V1 = c(rep('chr1', 6),rep('chr2', 4)), V2 = c(1:3, 5:7, 2:3, 7:8))) V1 V2 1: chr1 1 2: chr1 2 3: chr1 3
# Output
do.call(data.table, list(V1 = c(rep('chr1', 6),rep('chr2', 4)), V2 = c(1:3, 5:7, 2:3, 7:8)))
V1 V2
1: chr1 1
2: chr1 2
3: chr1 3
4: chr1 5
5: chr1 6
6: chr1 7
7: chr2 2
8: chr2 3
9: chr2 7
10: chr2 8
如何实现这一目标,有什么建议吗?我考虑过mapply(myOwnFunction,…),但也许已经有了内置的解决方案
任何想法都很好我没有内置的解决方案,这里有一个
tidyverse
方法:
dt.compact %>%
mutate(rng=map2(start, stop, ~.x:.y)) %>%
select(-start, -stop) %>%
unnest(cols=rng)
你可以做:
dt.compact[, .(chr, num = seq(start, stop)), by = 1:nrow(dt.compact)][, -1]
输出:
chr num
1: chr1 1
2: chr1 2
3: chr1 3
4: chr1 5
5: chr1 6
6: chr1 7
7: chr2 2
8: chr2 3
9: chr2 7
10: chr2 8
编辑:确实存在重复,但是@jogo提供了上述方法的一个变体&在其他主题中未提及:
dt.compact[, mapply(seq, start, stop), chr]
试试这个:
dt.compact[, .(chr, seq.int(start, stop)), by = 1:nrow(dt.compact)][, nrow := NULL][]
chr V2
1: chr1 1
2: chr1 2
3: chr1 3
4: chr1 5
5: chr1 6
6: chr1 7
7: chr2 2
8: chr2 3
9: chr2 7
10: chr2 8
或:
列名可以很容易地更改。或(类似):dt.compact[,mapply(seq,start,stop),chr]
dt.compact[, .(chr, seq.int(start, stop)), by = 1:nrow(dt.compact)][, nrow := NULL][]
chr V2
1: chr1 1
2: chr1 2
3: chr1 3
4: chr1 5
5: chr1 6
6: chr1 7
7: chr2 2
8: chr2 3
9: chr2 7
10: chr2 8
dt.new = dt.compact[, .(chr, seq.int(start, stop)), by = 1:nrow(dt.compact)][, nrow := NULL]
dt.new
chr V2
1: chr1 1
2: chr1 2
3: chr1 3
4: chr1 5
5: chr1 6
6: chr1 7
7: chr2 2
8: chr2 3
9: chr2 7
10: chr2 8