在R中创建函数时出错

在R中创建函数时出错,r,function,aggregate,R,Function,Aggregate,我正在尝试创建一个函数,因为我需要将同一代码多次应用于数据中的不同列 我的数据(df)如下所示: WEEK1.x WEEK1.y WEEK2.x WEEK2.y WEEK3.x WEEK3.y 1 660.14 1 690.74 2 821.34 1 2 -482.89 99 -368.12 99 -368.12 99 3 284.48 3 399.90 1 375.32 1 4

我正在尝试创建一个函数,因为我需要将同一代码多次应用于数据中的不同列

我的数据(df)如下所示:

  WEEK1.x WEEK1.y WEEK2.x WEEK2.y WEEK3.x WEEK3.y
1  660.14       1  690.74       2  821.34       1
2 -482.89      99 -368.12      99 -368.12      99
3  284.48       3  399.90       1  375.32       1
4 -554.18      99 -300.28      99 -300.28      99
然后我的函数看起来像:

  extra<-function(first_var, second_var){
  df$first_var=ifelse((df$first_var == 99),"99",
                      ifelse((df$first_var %in% c(1,2,3,4,5)),"1-5",NA))
  output=as.data.frame(aggregate(second_var~first_var, data = df, mean))
  return(output)
 }
  WEEK1<-extra("WEEK1.y", "WEEK1.x")
  WEEK2<-extra("WEEK2.y", "WEEK2.y")

extra这是您的函数的工作版本。
我使用了@a.Suliman建议的变体,但带有
[

extra <- function(first_var, second_var){
  df[[first_var]] <- ifelse((df[[first_var]] == 99), "99",
                      ifelse((df[[first_var]] %in% c(1,2,3,4,5)), "1-5", NA))
  fmla <- as.formula(paste(second_var, first_var, sep = "~"))
  aggregate(fmla, data = df, mean, na.rm = TRUE)
}

WEEK1 <- extra("WEEK1.y", "WEEK1.x")
WEEK1
#  WEEK1.y  WEEK1.x
#1     1-5  472.310
#2      99 -518.535


WEEK2 <- extra("WEEK2.y", "WEEK2.x")
WEEK2
#  WEEK2.y WEEK2.x
#1     1-5  545.32
#2      99 -334.20

您没有将df作为参数传递给函数,但在函数中使用了
df$first\u var
。请尝试
extra。包含数据的数据帧称为df,因此这不应该是问题,对吗?@A。Suliman@A.Suliman我确实尝试了你的建议,但我得到了相同的错误,然后我得到了两列的输出值WEEK1.y,而第二列是第二个变量,值为NA。@A。Suliman@A.Suliman不,在这种情况下,您是错的。R将在需要时强制使用
因子
。(使用
df[,first\u var]
的建议绝对正确。+1)谢谢。我对函数还不熟悉,但现在这很有意义。我将继续使用这种格式。@Rui ahaaa NA是由于
NA.rm=TRUE
而产生的。在
as.fromula
中拍摄得很好。干得好。
df <- read.table(text = "
  WEEK1.x WEEK1.y WEEK2.x WEEK2.y WEEK3.x WEEK3.y
1  660.14       1  690.74       2  821.34       1
2 -482.89      99 -368.12      99 -368.12      99
3  284.48       3  399.90       1  375.32       1
4 -554.18      99 -300.28      99 -300.28      99
", header = TRUE)