我正在尝试在R中编写一个函数:
1)接收数据帧和列名作为参数。 2)在数据框中的列上执行操作。
func <- function(col, df)
{
col = deparse(substitute(col))
print(paste("Levels: ", levels(df[[col]])))
}
func(Col1, DF)
func(Col2, DF)
mapply(func, colnames(DF)[1:2], DF)
输出
> func(Col1, DF)
[1] "Levels: GREEN" "Levels: YELLOW"
> func(Col2, DF)
[1] "Levels: 0.1" "Levels: 1"
> mapply(func, colnames(DF)[1:2], DF)
Error in `[[.default`(df, col) : subscript out of bounds
答案 0 :(得分:1)
两件事:
在函数func
中,您将deparse(substitute(col))
应用于您期望不是字符串的对象col
。因此,它可以与func(Col1, DF)
一起使用。但是在您的mapply()
调用中,参数colnames(...)
是一个字符串,因此会产生错误。与func('Col1', DF)
获得的错误相同。
在mapply()
调用中,所有参数都必须是向量或列表。因此,您需要使用list(df, df)
,或者如果您不想复制,请删除函数df
的参数func
。
这是一种可行的替代方法:
func <- function(col, df)
{
print(paste("Levels: ", levels(df[,col])))
}
mapply(FUN = func, colnames(DF)[1:2], list(DF, DF))
答案 1 :(得分:1)
请查看@demarsylvain的最新评论-也许是您身边的复制粘贴错误,您应该这样做:
func <- function(col,df) {
print(paste("Levels: ", levels(df[,col])))
}
mapply(FUN = func, c('Species', 'Species'), list(iris, iris))
您做到了:
func <- function(col) {
print(paste("Levels: ", levels(df[,col])))
}
mapply(FUN = func, c('Species', 'Species'), list(iris, iris))
请支持并接受@demarsylvain的解决方案,它有效
编辑以发表您的评论:
要为列名的任意列表提供通用版本,可以使用此代码,对于循环很抱歉:)
func <- function(col,df) {
print(paste("Levels: ", levels(df[,col])))
}
cnames = colnames(iris)
i <- 1
l = list()
while(i <= length(cnames)) {
l[[i]] <- iris
i <- i + 1
}
mapply(FUN = func, cnames, l)