【问题标题】:How to pass argument into user defined function when using lapply使用 lapply 时如何将参数传递给用户定义的函数
【发布时间】:2020-06-18 09:43:09
【问题描述】:

我有一个数据框列表,我想使用 lapply 对其应用自定义函数

这是我的功能:

  rename_cols_pattern <- function (df, pattern, replacement = "") {
  names(df) <- gsub(names(df), pattern = pattern, replacement = replacement)
}

如何在 lapply 中使用此功能?这不起作用,因为缺少 df 变量。如何传入 df 变量,该变量将是 di_data 列表中的数据帧

di_data <- lapply(di_data, rename_cols_pattern(pattern = "X"))

我可以让它像这样工作:

di_data <- lapply(di_data, function(x) {
  names(x) <- gsub(names(x), pattern = "X", replacement = "")
  x
})

但是我希望功能是分开的,并想了解如何实现这一点

【问题讨论】:

  • 需要lapply吗? map 有很好的匿名函数支持

标签: r


【解决方案1】:

您可能错过了函数的 return 语句。

rename_cols_pattern <- function(df, pattern, replacement="") {
  names(df) <- gsub(names(df), pattern=pattern, replacement=replacement)
  return(df)
}

正常使用:

rename_cols_pattern(dat, pattern="X", replacement="COL")
#   COL1 COL2 COL3 COL4
# 1    1    4    7   10
# 2    2    5    8   11
# 3    3    6    9   12

使用lapply:

lapply(list(dat, dat), rename_cols_pattern, pattern="X", replacement="COL")
# [[1]]
#   COL1 COL2 COL3 COL4
# 1    1    4    7   10
# 2    2    5    8   11
# 3    3    6    9   12
# 
# [[2]]
#   COL1 COL2 COL3 COL4
# 1    1    4    7   10
# 2    2    5    8   11
# 3    3    6    9   12

数据:

dat <- structure(list(X1 = 1:3, X2 = 4:6, X3 = 7:9, X4 = 10:12), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

    【解决方案2】:

    rename_with 就是为了解决这类问题而创建的

    library(tidyverse)
    
    mtcars %>% 
      rename_with(.fn = ~ str_remove_all(.x,"X"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      相关资源
      最近更新 更多