R 是一种非常多样化的编码语言,最终会有很多方法来做同样的事情。有些函数需要更标准的评估,而其他函数可能使用 NSE(非标准评估)。
但是,您似乎在询问只期望单个向量作为估算的函数,而不是具有 data 参数的函数,其中您使用 variable 而不是 data$variable。
在给出一些建议之前,我有几个侧边栏
边栏 1 - S3 方法
虽然这可能不是问题的重点,但函数kruskal.test 有两种方法。
methods("kruskal.test")
#[1] kruskal.test.default* kruskal.test.formula*
#see '?methods' for accessing help and source code
使用哪种方法取决于函数中第一个参数的类。在此示例中,您传递了一个公式表达式,其中 data 参数是必需的,而默认方法只需要 x 和 g 参数(您可能会使用原始管道)。
因此,如果您习惯于以一种方式做某事,请务必检查函数的文档是否有适合您的不同调度方法。
边栏 2 - 数据框
数据框实际上只是向量的集合。 f(data$variable) 和 f(x = variable, data = data) 之间的区别在于,第一个用户明确告诉 R 在哪里找到向量,而在后者中,函数 f 在上下文中评估 x data。
我提出这个是因为我在开始时所说的——有很多方法可以做同样的事情。因此,通常取决于您希望自己的标准是什么。
如果你更喜欢直白
vars <- c("data$age", "data$gender", "data$PCLR")
means <- sapply(vars, fmean, data$group, na.rm=TRUE)
krusk <- sapply(vars, kruskal.test, g = data$group)
或者你可以编写你的函数,期望它们在某个data.frame对象中被评估
vars <- c("age", "gender", "PCLR")
means <- sapply(vars, function(x, id, data) fmean(data[[x]], id = data[[id]], na.rm=T), id = "group", data = data)
krusk <- sapply(vars, function(x, id, data) kruskal.test(data[[x]], data[[id]]), id = "group", data = data)
我的建议
我建议查看以下软件包 dplyr、tidyr、purrr。我敢肯定,这些软件包中的某些东西会让您的生活更轻松。
例如,您曾表示必须在执行sapply 之前手动制作列表。在dplyr 包中,如果有过滤条件,您可以规避此问题。
data %>%
group_by(group) %>% #groups data
summarise_if(is.numeric, mean, na.rm = TRUE) #applys mean to every column that is a numeric vector
同样,如果我们稍微重塑数据,我们可以总结kurskal.test 函数的结果。
data %>%
group_by(group) %>% #grouping to retain column in the next select statement
select_if(is.numeric) %>% # selecting all numeric columns
pivot_longer(cols = -group) %>% # all columns except "group" will be reshaped. Column names are stored in `name`, and values are stored in `values`
group_by(name) %>% #regroup on name variable (old numeric columns)
summarise(krusk = list(kruskal.test(value ~ as.factor(group)))) #perform test
我只提到了purrr,因为您几乎可以将所有apply 样式函数替换为map 变体。 purrr 在其函数变体中非常一致,有很多选项来控制输出类型。
我希望这对您有所帮助,并祝您在编码冒险中好运。