【问题标题】:Passing column and data frame argument to my function in lapply()?在 lapply() 中将列和数据框参数传递给我的函数?
【发布时间】:2019-10-24 05:35:46
【问题描述】:

我有一个函数,它接收一个数据框和该数据框中的一列。我想使用 lapply() 将我的函数应用于数据框中的每一列,但我不知道该怎么做。 我认为它应该看起来像:

#dataframe is called kstarter
my_func(df, col) {
 ...
}
lapply(kstarter, arg1=kstarter, arg2=??)

但我似乎无法让它工作。 arg2 如何引用 lapply 迭代的每一列?我感谢您的帮助!

编辑:

我想申请使用的功能是:

get_col_info <- function(col, df) {
  unique_vals <- df %>% 
    select(col) %>%
    distinct() 
  num_u_vals <- nrow(unique_vals)
  if (is.numeric(df[[col]])) {
    return(list(
      min = min(df[[col]]),
      max = max(df[[col]]),
      mean = mean(df[[col]])
    ))
  } else if ((!is.numeric(df[[col]])) & num_u_vals < 10) {
    return(list(
      n_values = num_u_vals,
      unique_values = unique_vals %>% pull()
    ))
  } else if (!is.numeric(df[[col]]) & num_u_vals >= 10) {
    return(list(
      n_values = num_u_vals,
      sample_values = sample(df[[col]], size=10)
    ))
  }
}

get_col_info 需要将列名和数据框作为参数。 我想创建一个列表,使用 lapply 获取数据框中每一列的 col 信息,例如list &lt;- lapply(kstarter, get_col_info(current_col, kstarter)),但我无法弄清楚语法。请帮忙!

【问题讨论】:

  • “我有一个函数,它接收一个数据帧和该数据帧中的一列。我想使用 lapply() 将我的函数应用于数据帧中的每一列”你的问题不是很清楚,但看来你应该在你的函数中使用lapply。将函数foo 应用于data.frame DF 的所有列的方法是lapply(DF, foo)。这仅在foo 接受向量作为输入时才有效,因为lapplyDF 中的向量(列)传递给foofoo 当然可以接受其他输入(您可以在 lapply 中指定),但是您迭代的 data.frame 需要在 foo 之外。
  • @Roland 如何指定 lapply 以使 foo 接受数据帧作为另一个输入?
  • 我认为您可以简单地使用lapply(kstarter, get_col_info, df = kstarter),但您必须将函数中的第一个块更改为unique_vals &lt;- unique(df[[col]])

标签: r dplyr apply lapply


【解决方案1】:

当您在数据框上使用 lapply 时,它会自动循环遍历列。这是一个使用 iris 数据集的示例,但如果您提供一些可重现的示例,我可以根据您的数据对其进行调整。

lapply(iris, mean)

代替函数mean,您可以使用自己的自定义匿名函数,如下所示:

lapply(iris, function(column){
  rtn=mean(column, na.rm=T)
  return(rtn)
})

或者你构建的函数是这样的:

my_func = function(column){
  rtn=mean(column, na.rm=T)
  return(rtn)
}
lapply(kstarter, myfunc)

另外,我建议您从 purrr 包中查找 map 函数,因为它可以让您更好地控制返回类型。例如purrr::map(kstarter, myfunc) 会返回一个list,而purrr::map_df(kstarter, myfunc) 会返回一个data.frame

【讨论】:

  • 我尝试使用的方法是构建函数,但是,我的构建函数有 2 个参数(数据框和列)。我不确定如何使用 lapply 传入列和数据框。在您的示例中,您使用 lapply(kstarter, myfunc) 但 myfunc 需要数据框和列名。所以 myfunc 看起来更像my_func = function(column, dataframe){。有什么想法吗?
  • 很难理解“myfunc 需要数据框和列名”的意思。如果循环遍历列名会发生什么?你能举一个你的函数的例子吗?
  • @StupidWolf 我为歧义道歉,我编辑了我的帖子以包含我的功能
  • 好的,我现在知道了。我试着在下面回答
猜你喜欢
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多