【问题标题】:Replacing dplyr::funs() within imap that refers to the .y value替换 imap 中引用 .y 值的 dplyr::funs()
【发布时间】:2020-05-20 13:50:36
【问题描述】:

areseveralposts 询问如何替换已弃用的软 funs(),但没有一个解决方案对我有用。

我有一个已命名的小标题列表,并希望使用这些名称重命名几列,以准备将所有数据框连接在一起并整理数据。

以下代码正确更改(取消)选定的列名。

df <- tibble("Feature ID" = c("ABC (Homo Sapiens)", "DEF (Caenorhabditis elegans)"),
              Resource = c("Homo Sapiens", "Caenorhabditis elegans"),
              Name = c("ABC", "DEF"),
              Signal1 = c(10, 20),
              Signal2 = c(80, 90))

list("first_set" = df,
     "second_set" = df) %>%
  imap(~ rename_at(.x, 
                   .vars = vars(-"Feature ID", -Resource, -Name), 
                   .funs = funs(str_c(.y, ., sep = "_"))))

但是用 list(~str_c(.y, ., sep = "_")) 或简单地 str_c(.y, ., sep = "_") 替换 funs 会出现错误

Error in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE) : the ... list contains fewer than 2 elements

我预计错误是数据框的名称或列名称未正确输入stri_c(),因为它表示列表太短。但是我不明白为什么它在 funs() 中起作用,而当我更改为 list 或只是 ~ 时不起作用。

【问题讨论】:

  • 您能添加您的预期输出吗? imap 有什么特别的原因吗?
  • @NelsonGon 不确定如何在此处添加 tibble 输出,但运行它应该可以正常工作。预期的输出只是通过添加“df1_”作为前缀来重命名列。我使用 imap 是因为我不确定如何引用小标题列表的名称 - map2 是等价的,不是吗?我很高兴发现一种更好的方法。

标签: r dplyr tidyverse


【解决方案1】:

我认为它会在同一个函数中使用太多代词,R 会感到困惑。我在地图之外运行了这个函数,它按预期工作,所以你的调用没有问题。

如果您使函数显式并用 a 和 b 替换 .x 和 .y ,它就可以工作。 R 有时可能相当迂腐

    list("first_set" = df,
     "second_set" = df)%>%
       imap(.,
       function(a,b){rename_at(a, 
                      .vars = vars(c("Feature ID", "Resource", 'Name')), 
                      .funs = ~{str_c(b, ., sep = "_")})})

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    相关资源
    最近更新 更多