在 R 中使用 map2 或 seq 函数填充两个变量之间的整数

Use of map2 or seq functions in R to fill integers between two variables

我有一个 data.frame,其中包含约 20 万个条目,如下所示:

x <- c(1, 3, 5, 6, 8)
y <- c(2, 5, 6, 8, 12)
my.list <- list(start = x, end = y) %>% as.data.frame()

基于此,我想定义一个新变量,它将取 x 和 y 之间的所有整数。因此,根据上面的示例,第 2 行有 3,4,5,第 5 行有 8,9,10,11,12。

我通过以下方法解决了这个问题:


library(dplyr)
library(purrr)

my.list %>% mutate(new = map2(start, end, `:`))

但考虑到它检索了一个列表,我不知道以后如何将其保存为数据框。

知道怎么解决吗? R 中的 seq() 函数在这种情况下是否有用?由于它是如此庞大的数据框,使用 shell?

中的一些命令来解决会更容易吗?

欢迎任何提示。

这可能不是最有效的解决方案,但使用 for 循环应该可行。

for(row in length(x) {
    my.list <- rbind(my.list(c(x[row]:y[row]))
}

语法可能不完全正确,但概念应该作为起点。希望这有帮助。

base

中有一个方便的方法
my.list$list_col <- mapply(`:`, my.list$start, my.list$end)

如果您想在 dplyr 中做到这一点,请尝试

my.list <- 
  my.list %>% 
  rowwise %>% 
  mutate(list_col = list(start:end))

使用rowwise

my.list %>% 
  rowwise() %>% 
  mutate(new = map2(start, end, `:`))

x <- c(1, 3, 5, 6, 8)
y <- c(2, 5, 6, 8, 12)

library(tidyverse)

my.list <- list(start = x, end = y) %>% as.data.frame()

my.list %>% 
  rowwise() %>% 
  mutate(new = map2(start, end, seq)) %>% 
  unnest(c(new))
#> # A tibble: 15 x 3
#>    start   end   new
#>    <dbl> <dbl> <int>
#>  1     1     2     1
#>  2     1     2     2
#>  3     3     5     3
#>  4     3     5     4
#>  5     3     5     5
#>  6     5     6     5
#>  7     5     6     6
#>  8     6     8     6
#>  9     6     8     7
#> 10     6     8     8
#> 11     8    12     8
#> 12     8    12     9
#> 13     8    12    10
#> 14     8    12    11
#> 15     8    12    12

reprex package (v2.0.1)

于 2021-11-05 创建