gpt4 book ai didi

r - R 操作中的一对一应用/映射

转载 作者:行者123 更新时间:2023-12-05 01:22:32 24 4
gpt4 key购买 nike

我在 list 中有 3 个小标题,我想为每个小标题添加一个具有不同值的列。我发现除了使用通常的 for 循环之外很难做到这一点(当然,for 可能是这个用例中的最佳解决方案,但我很好奇是否有聪明的解决方案)。

library(tibble)
library(dplyr)

t1 <- tibble(a=1:10, b=2:11, c=3:12)
t2 <- tibble(a=1:10, b=2:11, c=3:12)
t3 <- tibble(a=1:10, b=2:11, c=3:12)
tlist <- list(t1, t2, t3)

names <- c("A", "B", "C")

我想要实现的结果与我们在每个 tibble 上执行 dplyr::mutate 以添加带有 names 值的额外列的结果相同分别;举例说明:

t1 %>% mutate(name=names[1])
t2 %>% mutate(name=names[2])
t3 %>% mutate(name=names[3])

我已经尝试过 lapplysapplymapply(以及其中两者的一些组合)或 purrr::map,我看不到在单个 tibble 上应用单个值的 mutate 操作的方法(即,一对一应用/映射)。 Pythonzip,它有时会创建一对我们可以在 apply 函数中轻松访问的值,但我们在 R.

R 中的一段 pusedo-ish 代码(模仿 Python 中的 zip 的样子):

args <- pair(tlist, names)

add.col <- function(arg.pair) -> {
arg.pair[[1]] %>% mutate(name=arg.pair[[2]])
}

res <- args %>% lapply(add.col)

请注意,apply 函数不接受 Pair 对象(来自 stats 包的实用程序)。

随着我越来越沉迷于apply,这很可能是我的盲点;有没有一种巧妙的方法来进行这种一对一映射?

最佳答案

使用map2:

library(purrr)
library(dplyr)
map2(tlist, names,
~ .x %>%
mutate(name = .y))

或者在带有 Map 的 base R 中:

Map(function(x, y) transform(x, name = y), tlist, names)

输出:

[[1]]
# A tibble: 10 × 4
a b c name
<int> <int> <int> <chr>
1 1 2 3 A
2 2 3 4 A
3 3 4 5 A
4 4 5 6 A
5 5 6 7 A
6 6 7 8 A
7 7 8 9 A
8 8 9 10 A
9 9 10 11 A
10 10 11 12 A

[[2]]
# A tibble: 10 × 4
a b c name
<int> <int> <int> <chr>
1 1 2 3 B
2 2 3 4 B
3 3 4 5 B
4 4 5 6 B
5 5 6 7 B
6 6 7 8 B
7 7 8 9 B
8 8 9 10 B
9 9 10 11 B
10 10 11 12 B

[[3]]
# A tibble: 10 × 4
a b c name
<int> <int> <int> <chr>
1 1 2 3 C
2 2 3 4 C
3 3 4 5 C
4 4 5 6 C
5 5 6 7 C
6 6 7 8 C
7 7 8 9 C
8 8 9 10 C
9 9 10 11 C
10 10 11 12 C

关于r - R 操作中的一对一应用/映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73896188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com