gpt4 book ai didi

r - 在 R 函数中调用 data.frame 列?

转载 作者:行者123 更新时间:2023-12-04 02:20:37 26 4
gpt4 key购买 nike

执行此操作的正确方法是什么?

我有一个函数,在给定一系列输入的情况下,它自己可以很好地工作,我想在大型数据集上使用这个函数,而不是通过逐行循环数据来处理奇异值。我试图更新函数以调用 data.frame 列而不是向量值,但没有成功。

一个简单的例子是:

假设我有一个包含 4 列的 date.frame,data$id、data$height、data$weight、data$gender。我想编写一个函数来遍历每一行(使用应用)并计算 BMI (kg/m^2)。我知道使用 dplyr 很容易做到,但我想学习如何在不求助于外部包的情况下做到这一点,但找不到如何正确引用函数中的列的明确答案。

如果这是重复的,请提前致歉。我一直在非常彻底地搜索 Stackoverflow,希望找到一个现有的例子。

最佳答案

我想这就是您要找的。从功能上引用数据框列的最简单方法是使用带引号的列名。原则上,你做的是这个

data[, "weight"] / data[, "height"]^2

但在函数内部您可能想让用户指定高度或体重列的名称不同,这样您就可以编写函数

add_bmi = function(data, height_col = "height", weight_col = "weight") {
data$bmi = data[, weight_col] / data[, height_col]
return(data)
}

此函数将假定要使用的列默认命名为“高度”和“体重”,但用户可以根据需要指定其他名称。您可以改为使用列索引来执行类似的解决方案,但使用名称往往更易于调试。

这么简单的功能很少有用。如果您正在计算大量数据集的 BMI,也许值得保留此函数,但由于它是 base R 中的单行代码,您可能不需要它。

my_data$BMI = with(my_data, weight / height^2)

需要注意的是,使用存储在变量中的列名意味着您不能使用 $。这是我们通过让事情变得更加程序化而付出的代价,对于这样的应用程序养成一个好习惯是一个好习惯。参见 fortunes::fortune(343):

Sooner or later most R beginners are bitten by this all too convenient shortcut. As an R newbie, think of R as your bank account: overuse of $-extraction can lead to undesirable consequences. It's best to acquire the '[[' and '[' habit early.

-- Peter Ehlers (about the use of $-extraction) R-help (March 2013)

对于像 dplyr 这样的更高级的用法,你不需要引用列名等(并且可以计算表达式),lazyeval 包使事情变得相对轻松和有非常好的小插曲。

基函数 with 可以用来做一些懒惰的评估,例如,

with(mtcars, plot(disp, mpg))
# sometimes with is nice
plot(mtcars$disp, mtcars$mpg)

但是 with 最好以交互方式和简单的脚本使用。如果您开始编写程序化生产代码(例如,您自己的 R 包),避免非标准评估会更安全。例如,请参阅 ?subset 中的警告,这是另一个使用非标准评估的基本 R 函数。

关于r - 在 R 函数中调用 data.frame 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30177718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com