R 在lappy()中将列和数据帧参数传递给我的函数?

R 在lappy()中将列和数据帧参数传递给我的函数?,r,dplyr,apply,lapply,R,Dplyr,Apply,Lapply,我有一个函数,它接收一个数据帧和该数据帧中的一列。我想使用lappy()将我的函数应用于数据帧中的每一列,但我不确定如何做到这一点。 我认为应该是这样的: #dataframe is called kstarter my_func(df, col) { ... } lapply(kstarter, arg1=kstarter, arg2=??) 但我似乎无法让它发挥作用。arg2如何引用Lappy迭代的每一列?我感谢你的帮助 编辑: 我要应用的功能是: get_col_info <-

我有一个函数,它接收一个数据帧和该数据帧中的一列。我想使用lappy()将我的函数应用于数据帧中的每一列,但我不确定如何做到这一点。 我认为应该是这样的:

#dataframe is called kstarter
my_func(df, col) {
 ...
}
lapply(kstarter, arg1=kstarter, arg2=??)
但我似乎无法让它发挥作用。arg2如何引用Lappy迭代的每一列?我感谢你的帮助

编辑:

我要应用的功能是:

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\u col\u info%
不同的()
数值%pull()
))
}如果(!is.numeric(df[[col]])&num\u\u vals>=10,则为else){
返回(列表)(
n_值=数值,
样本值=样本(df[[col]],大小=10)
))
}
}
get\u col\u info
需要将列名和数据帧作为参数。
我想创建一个列表,使用lappy获取数据帧中每个列的列信息,类似于
list当您在数据帧上使用
lappy
时,它会自动循环到列上。下面是一个使用
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)
或者您的内置函数如下所示:

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)

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

“我有一个函数,它接收一个数据帧和该数据帧中的一列。我想使用lappy()对数据帧中的每一列应用我的函数。”您的问题并不十分清楚,但似乎应该在函数中使用
lappy
。将函数
foo
应用于data.frame
DF
的所有列的方法是
lappy(DF,foo)
。这仅在
foo
接受向量作为输入时有效,因为
lappy
DF
中的向量(列)传递给
foo
foo
当然可以接受其他输入(您可以在
Lappy
中指定),但是您迭代的data.frame需要在
foo
之外@Roland如何指定Lappy以使foo接受数据帧作为另一个输入?我认为您可以简单地使用
Lappy(kstarter,get\col\u info,df=kstarter)
,但是您必须将函数中的第一个块更改为类似于
unique\vals的内容。我尝试使用的方法是构建函数,但是,我构建的函数有两个参数(dataframe和column)。我不知道如何使用lappy传入列和数据帧。在您的示例中,使用了
lappy(kstarter,myfunc)
,但myfunc需要数据帧和列名。所以myfunc看起来更像
myfunc=function(column,dataframe){
。有什么想法吗?很难理解“myfunc需要数据框和列名”是什么意思。如果你循环浏览列名会发生什么?你能举一个你的函数的例子吗?@StupidWolf我为模棱两可道歉,我编辑了我的帖子,加入了我的函数。我现在明白了。我试着回答下面的问题