R data.table - 根据值添加行
R data.table - add row based on value
我下面有data.tablex
x <- data.table(id=c('A1', 'B1'), start=c(1,1), stop=c(4,5))
id
start
stop
A1
1
4
B1
1
5
我想扩展行。是否可以使用 rbindlist 使用 Map 生成如下所示的 data.table?
id
start
stop
A1
1
2
A1
2
3
A1
3
4
B1
1
2
B1
2
3
B1
3
4
B1
4
5
您可以为每个 id
创建一个从 start
到 stop
的序列。使用 shift
获取下一个值并删除 NA
行。
library(data.table)
x <- x[, .(start = seq(start, stop)), id]
x[, stop := shift(start, type = 'lead'), id]
x[!is.na(stop)]
# id start stop
#1: A1 1 2
#2: A1 2 3
#3: A1 3 4
#4: B1 1 2
#5: B1 2 3
#6: B1 3 4
#7: B1 4 5
这是一个等效的 tidyverse
方式 -
library(tidyverse)
x %>%
mutate(start = map2(start, stop, seq)) %>%
unnest(start) %>%
group_by(id) %>%
mutate(stop = lead(start)) %>%
ungroup %>%
filter(!is.na(stop))
我下面有data.tablex
x <- data.table(id=c('A1', 'B1'), start=c(1,1), stop=c(4,5))
id | start | stop |
---|---|---|
A1 | 1 | 4 |
B1 | 1 | 5 |
我想扩展行。是否可以使用 rbindlist 使用 Map 生成如下所示的 data.table?
id | start | stop |
---|---|---|
A1 | 1 | 2 |
A1 | 2 | 3 |
A1 | 3 | 4 |
B1 | 1 | 2 |
B1 | 2 | 3 |
B1 | 3 | 4 |
B1 | 4 | 5 |
您可以为每个 id
创建一个从 start
到 stop
的序列。使用 shift
获取下一个值并删除 NA
行。
library(data.table)
x <- x[, .(start = seq(start, stop)), id]
x[, stop := shift(start, type = 'lead'), id]
x[!is.na(stop)]
# id start stop
#1: A1 1 2
#2: A1 2 3
#3: A1 3 4
#4: B1 1 2
#5: B1 2 3
#6: B1 3 4
#7: B1 4 5
这是一个等效的 tidyverse
方式 -
library(tidyverse)
x %>%
mutate(start = map2(start, stop, seq)) %>%
unnest(start) %>%
group_by(id) %>%
mutate(stop = lead(start)) %>%
ungroup %>%
filter(!is.na(stop))