R 在lappy()中将列和数据帧参数传递给我的函数?
我有一个函数,它接收一个数据帧和该数据帧中的一列。我想使用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 <-
#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.frameDF
的所有列的方法是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我为模棱两可道歉,我编辑了我的帖子,加入了我的函数。我现在明白了。我试着回答下面的问题