R函数如何取df的名称

时间:2014-04-10 14:02:56

标签: r function statistics

我真的是R的新手。我有这个功能:

    Myfunction <- function (Amean, Asd, An, Bmean, Bsd, Bn, NameOfMYdf)
 {
    NameOfMYdf$Difference <- (Amean - Bmean)
    NameOfMYdf$SDP <- sqrt((((An - 1) * Asd^2 + (Bn - 1) * Bsd^2) / (An + Bn - 2)))

}

当我调用此函数时,我想从我的数据集中输入变量名称。 有了这个功能,我想在同一个数据集中创建2个新变量:
NameOfMYdf $差异 NameOfMYdf $ SDP

我认为这很容易,但我无法弄清楚

感谢大家

有没有办法输入我的变量名称和计算?...所以我想输入

Myfunction (meanGroupA, sdGroupA, nGroupA, meanGroupA, sdGroupB, nGroupB, NameOfMyDataset)

基本上,我想用函数

传递数据集名称

感谢

2 个答案:

答案 0 :(得分:1)

我使用transform制作你想要的东西,看看这个简单的例子:

> df <- head(mtcars)[, 1:3]
> transform(df,                   # a data.frame to be transformed
            Difference=mpg-cyl,   # first transformation
            DSP=disp^2)           # replace with sqrt((((An - 1) * Asd^2 + (Bn - 1) * Bsd^2) / (An + Bn - 2)))
                   mpg cyl disp Difference    DSP
Mazda RX4         21.0   6  160       15.0  25600
Mazda RX4 Wag     21.0   6  160       15.0  25600
Datsun 710        22.8   4  108       18.8  11664
Hornet 4 Drive    21.4   6  258       15.4  66564
Hornet Sportabout 18.7   8  360       10.7 129600
Valiant           18.1   6  225       12.1  50625

答案 1 :(得分:1)

你的问题是从典型的面向对象的角度来看R,你有一个修改对象的函数/方法。 (看起来您希望MyFunction将列添加到您提供的任何data.frame中。)

R是函数式编程语言,这意味着它倾向于这样做。有很多方法可以实现,但它们很难很好地使用,通常被认为是不好的做法。

让我们以类似R的方式做一个简单的例子:

# sample data
mydata <- data.frame(a = rnorm(10), b = runif(10))

然后让我们说你想要做很多两列的功能

common_task <- function(x, y) {
    ((x - 1) * y + (y - 1) * x) / (x + y - 2)
}

将此添加到data.frame的最简单/最常用的方法是

mydata$calc <- common_task(x = mydata$a, y = mydata$b)

如果要使用变量名称,则字符串可以正常工作。如果您的任务将始终在包含名为ab的列的data.frame上执行,那么您可以使用函数来确定data.frame具有以下列名称:

common_task2 <- function(data) {
    ((data$a - 1) * data$b + (data$b - 1) * data$a) /
        (data$a + data$b - 2)
}

更好的方法是让列名称作为字符串输入,但为此$子集快捷键不起作用,我们需要使用[

common_task3 <- function(data, x = "a", y = "b") {
      ((data[, x] - 1) * data[, y] + (data[, y] - 1) * data[, x]) / (data[, x] + data[, y] - 2)
}

最后一个函数将假设您要处理的列名是&#34; a&#34;和&#34; b&#34;,除非你另有说明。

但是,在所有三种情况下,该函数只返回一个新列。要在函数之外的data.frame中获取它,您需要分配它,即

mydata$new_col3 <- common_task3(data = mydata)
mydata$new_col2 <- common_task2(data = mydata)

您可以在函数内部分配列,但是您仍然需要将结果分配给data.frame,它不会只修改函数之外的data.frame:

common_task4 <- function(data, x = "a", y = "b") {
    data$result <-((data[, x] - 1) * data[, y] + (data[, y] - 1) * data[, x]) /
        (data[, x] + data[, y] - 2)
    return(data)
}

my_modified_data <- common_task4(data = mydata)

在所有这些情况下,都有很好的功能可以帮到你。 @ Jilber的回答建议transform,这是一个很好的答案。 dplyr库也非常好用且易于使用。您可以编写自己的版本,但现有版本通常会更快,更强大。

有关更多详情和示例,请参阅Advanced R Programming: Functions