在 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 创建
我有一个 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 创建