我真的是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)
基本上,我想用函数
传递数据集名称感谢
答案 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)
如果要使用变量名称,则字符串可以正常工作。如果您的任务将始终在包含名为a
和b
的列的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。