【问题标题】:self-assigning objects after applying the same function to each object对每个对象应用相同功能后自分配对象
【发布时间】:2021-04-04 10:00:25
【问题描述】:

有时我想将相同的功能应用于环境中存在的多个对象并将这些对象分配给它们自己。但这通常需要写下多个自赋值运算符,效率不高且容易出错。

这是这个例程的最小版本:

# setup
library(magrittr)
library(tibble)

# creating a few dataframes for a demo
df1 <- mtcars
df2 <- ToothGrowth
df3 <- anscombe

# performing the *same* operation on 3 different objects
# and self-assigning using magrittr's assignment pipe
df1 %<>% as_tibble(.)
df2 %<>% as_tibble(.)
df3 %<>% as_tibble(.)

这里不是重复as_tibble 三次,有没有办法让我通过指定我想对所有对象应用的函数来自我分配对象仅一次(请参阅zeallot::%&lt;-%寻找灵感)。

如果解决方案来自 tidyverse 包,我更愿意,但也不介意 base-R 解决方案。

【问题讨论】:

  • 谢谢。在tidyverse 中,我是否只需将lapply 替换为purrr::map
  • 也就是说,我的问题有点不同,因为我希望对象在修改后自行分配。您指出的解决方案将修改后的对象存储在列表中,这意味着我需要跟踪哪个对象属于列表中的哪个位置。

标签: r tidyverse


【解决方案1】:

首先将对象放在一个命名列表中。然后,您可以使用 map/lapply 迭代每个并应用您想要的功能。

library(tidyverse)

list_df <- lst(df1, df2, df3)
result <- map(list_df, function(x) {
              as_tibble(x)
              #do more things
            })

如果您想将此更改的数据传输到原始对象,请使用list2env

list2env(result, .GlobalEnv)

【讨论】:

    【解决方案2】:

    这是zeallot的选项

    library(zeallot)
    library(purrr)
    map(mget(ls(pattern = '^df\\d+$')), as_tibble) %->%
              c(df1, df2, df3)
    

    -检查

     head(df1)
    # A tibble: 6 x 11
        mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
    2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
    3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
    4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
    5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
    6  18.1     6   225   105  2.76  3.46  20.2     1     0     3     1
    head(df2)
    # A tibble: 6 x 3
        len supp   dose
      <dbl> <fct> <dbl>
    1   4.2 VC      0.5
    2  11.5 VC      0.5
    3   7.3 VC      0.5
    4   5.8 VC      0.5
    5   6.4 VC      0.5
    6  10   VC      0.5
    head(df3)
    # A tibble: 6 x 8
         x1    x2    x3    x4    y1    y2    y3    y4
      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1    10    10    10     8  8.04  9.14  7.46  6.58
    2     8     8     8     8  6.95  8.14  6.77  5.76
    3    13    13    13     8  7.58  8.74 12.7   7.71
    4     9     9     9     8  8.81  8.77  7.11  8.84
    5    11    11    11     8  8.33  9.26  7.81  8.47
    6    14    14    14     8  9.96  8.1   8.84  7.04
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多