【问题标题】:R data.table - add row based on valueR data.table - 根据值添加行
【发布时间】:2021-08-24 00:37:48
【问题描述】:

下面有data.table x

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

【问题讨论】:

标签: r data.table mapply


【解决方案1】:

您可以为每个id 创建一个从startstop 的序列。使用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))

【讨论】:

  • 只是想理解....您在第二个中使用了 .(),例如 "x
  • 是的,没错。当您的输出与数据中的行数相同时,使用:=。因为在第一种情况下,我们为使用 .( 的每一行返回多个值。
猜你喜欢
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多