Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建宽(非汇总)R data.table_R_Data.table - Fatal编程技术网

创建宽(非汇总)R data.table

创建宽(非汇总)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

我有一个紧凑的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
 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