purrr: modify2 и modify_at - PullRequest
       4

purrr: modify2 и modify_at

2 голосов
/ 26 февраля 2020

с учетом следующего списка

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 для таких вещей. Но не понимаю.

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

Другой вариант может быть:

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
2 голосов
/ 26 февраля 2020

В основном то же самое, что и @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))
1 голос
/ 26 февраля 2020

Возможно, не так аккуратно, как хотелось бы, но использование 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] NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...