我想修改dplyr::muate()中的列属性.以下是一些示例数据:

library(dplyr, warn.conflicts = FALSE)
v1 <- tibble(
  id = 1:5,
  visit = 1,
  x = 1:5,
  y = c(0, 0, 0, 1, 1)
)

我想要得到的最终结果与我想要得到的结果相同:

attr(v1$id, "source") <- "Collected at v1"
attr(v1$visit, "source") <- "Collected at v1"
attr(v1$x, "source") <- "Collected at v1"
attr(v1$y, "source") <- "Collected at v1"

我知道我可以只使用for循环.

for (col in names(v1)) {
  attr(v1[[col]], "source") <- "Collected at v1"
}

然而,我有理由想在dplyr内部这样做.我正试着go 做这样的事情.

v1 %>% 
  mutate(
    across(
      .cols = everything(),
      .fns  = ~ function_to_update_attributes("source", "Collected at v1")
    )
  )

现在,我甚至不能让它对单个变量起作用.这是我最接近的一次了.

v1 %>% 
  mutate(
    id = `<-`(attr(.[["id"]], "source"), "Collected at v1")
  )

它会返回

# A tibble: 5 × 4
  id              visit     x     y
  <chr>           <dbl> <int> <dbl>
1 Collected at v1     1     1     0
2 Collected at v1     1     2     0
3 Collected at v1     1     3     0
4 Collected at v1     1     4     1
5 Collected at v1     1     5     1

????欢迎并感谢任何有建设性的反馈!

这也发布在RStudio社区上:https://community.rstudio.com/t/modify-arbitrary-column-attributes-using-dplyr-mutate/144502

推荐答案

我们可以使用dplyr

library(dplyr)
v1 <- v1 %>%
    mutate(across(everything(), 
     ~ {attr(.x, "source") <- "Collected at v1"
    .x} ))

-输出

> str(v1)
tibble [5 × 4] (S3: tbl_df/tbl/data.frame)
 $ id   : int [1:5] 1 2 3 4 5
  ..- attr(*, "source")= chr "Collected at v1"
 $ visit: num [1:5] 1 1 1 1 1
  ..- attr(*, "source")= chr "Collected at v1"
 $ x    : int [1:5] 1 2 3 4 5
  ..- attr(*, "source")= chr "Collected at v1"
 $ y    : num [1:5] 0 0 0 1 1
  ..- attr(*, "source")= chr "Collected at v1"

或者,如果我们想要使用Access,则使用cur_column()并使用<<-赋值

v1 %>%
  mutate(across(everything(), 
  ~ {attr(v1[[cur_column()]], "source") <<- "Collected at v1"
   .x})) 

-输出

> str(v1)
tibble [5 × 4] (S3: tbl_df/tbl/data.frame)
 $ id   : int [1:5] 1 2 3 4 5
  ..- attr(*, "source")= chr "Collected at v1"
 $ visit: num [1:5] 1 1 1 1 1
  ..- attr(*, "source")= chr "Collected at v1"
 $ x    : int [1:5] 1 2 3 4 5
  ..- attr(*, "source")= chr "Collected at v1"
 $ y    : num [1:5] 0 0 0 1 1
  ..- attr(*, "source")= chr "Collected at v1"

或者,如果我们想要复制相同的行为,即使用原始数据对象名称及其列名称,就像在for循环中一样,使用reduce

library(purrr)
v1 <- reduce(names(v1), ~ {
         attr(.x[[.y]], "source") <- "Collected at v1"
             .x}, .init = v1)

-输出

> str(v1)
tibble [5 × 4] (S3: tbl_df/tbl/data.frame)
 $ id   : int [1:5] 1 2 3 4 5
  ..- attr(*, "source")= chr "Collected at v1"
 $ visit: num [1:5] 1 1 1 1 1
  ..- attr(*, "source")= chr "Collected at v1"
 $ x    : int [1:5] 1 2 3 4 5
  ..- attr(*, "source")= chr "Collected at v1"
 $ y    : num [1:5] 0 0 0 1 1
  ..- attr(*, "source")= chr "Collected at v1"

R相关问答推荐

使用Shiny组合和显示复制和粘贴的数据

多个ggpredicate对象的平均值

计算R中的威布尔分布的EDF

Highcharter多次钻取不起作用,使用不同方法

如何删除gggvenn与gggplot绘制的空白?

derrr summarise每个组返回多行?

如何在geom_col中反转条

如何调整曲线图中的y轴标签?

提取第一个下划线和最后一个下划线之间的任何内容,例外情况除外

您是否可以折叠R中的重复行,同时保留基于所选列的值?

Ggplot2中geom_tile的动态zoom

在R函数中使用加号

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

查找所有站点的最小值

为什么函数toTitleCase不能处理english(1),而toupper可以?

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

计算来自单独分组的分幅的值的百分位数

填充图例什么时候会有点?

是什么打破了此Quarto仪表板中的工具提示?

带查找数据的FCT_REORDER.帧