考虑下列清单
df <- list(list(a = 1, b = NA_real_, c = NA_real_, d = NA_real_, e = NA_real_),
list(a = 1, b = NA_real_, c = NA_real_, d = NA_real_, e = NA_real_),
list(a = 1, b = NA_real_, c = NA_real_, d = NA_real_, e = NA_real_),
list(a = 1, b = NA_real_, c = NA_real_, d = NA_real_, e = NA_real_),
list(a = 1, b = NA_real_, c = NA_real_, d = NA_real_, e = NA_real_))我希望根据外部列表索引更改"a“位置中的值,如下所示:
df[[1]]$a <- 1
df[[2]]$a <- 2
df[[3]]$a <- 3但是我想使用purrr函数,比如
library(tidyverse)
df %>%
modify_depth(1, ~modify_at(., "a", ~. + 1))我很肯定我们可以用modify2来做这样的事情。但别明白。
发布于 2020-02-26 16:24:06
基本上与@tmfmnk相同,但使用modify2()。
library(purrr)
modify2(df, seq_along(df), ~ list_modify(.x, .y))注意,按位置更改a。可能想要做a = .y,并且更明确。
我想那应该是:
df2 <- df %>%
modify2(., seq_along(.), ~ list_modify(.x, a = .y))
df2[3]
# [[1]]
# [[1]]$a
# [1] 3
#
# [[1]]$b
# [1] NA
#
# [[1]]$c
# [1] NA
#
# [[1]]$d
# [1] NA
#
# [[1]]$e
# [1] NA编辑:
看看@camille的另一个回复,这可能是最干净的。
df %>%
imap(~ list_modify(.x, a = .y))发布于 2020-02-26 16:04:18
另一种选择可以是:
map2(.x = df,
.y = 1:length(df),
~ update_list(.x, a = ~ .y))
[[1]]
[[1]]$a
[1] 1
[[1]]$b
[1] NA
[[1]]$c
[1] NA
[[1]]$d
[1] NA
[[1]]$e
[1] NA
[[2]]
[[2]]$a
[1] 2
[[2]]$b
[1] NA
[[2]]$c
[1] NA
[[2]]$d
[1] NA
[[2]]$e
[1] NA发布于 2020-02-26 15:45:38
也许没有您想要的那么整洁,但是使用purrr::imap可以让您访问项的索引,然后可以将这些索引分配给每个"a"元素。一定要把名单还给我。AFAIK --您将在imodify中获得相同的结果。
library(purrr)
df2 <- df %>%
imap(function(l, i) {
l[["a"]] <- i
l
})
df2[4]
#> [[1]]
#> [[1]]$a
#> [1] 4
#>
#> [[1]]$b
#> [1] NA
#>
#> [[1]]$c
#> [1] NA
#>
#> [[1]]$d
#> [1] NA
#>
#> [[1]]$e
#> [1] NAhttps://stackoverflow.com/questions/60417444
复制相似问题