【问题标题】:Writing a function with matrix in R: format and syntax edits在 R 中用矩阵编写函数:格式和语法编辑
【发布时间】:2015-10-04 19:31:46
【问题描述】:

我想编写一个执行以下操作的函数。它有两个参数,arg1 和 arg2,而 arg2 的默认值设置为 1。当调用该函数时,用户将数据框/矩阵分配给 arg 1,并将 1、2 或 3 分配给 arg2。

如果 arg1 被赋值为 1,则函数返回包含所有列名的向量

如果 arg 2 被赋值为 2,函数返回每一列的平均值

如果 arg2 被赋值为 3,则函数返回每一行的中位数。

如果为 arg2 分配了 1、2 或 3 之外的任何值,则该函数会打印一条错误消息。

到目前为止,这是我的代码:

my_Func1<-function(arg1)
A<-data.matrix(arg1)

if(arg2==1){
return(colnames(arg1))
}
else {arg2==2){
colMeans(A)
}
else{arg2==3){
rowMedians(A)
}
else if (missing(arg2))
writeLines(“ The value must be 1, 2, or 3”)
}
}

在我的机器上,它有时会编译并生成空矩阵,或者它根本无法编译。我不太清楚错误在哪里,但我怀疑它的语法。有人可以帮我确定问题所在并建议我需要做出哪些改变吗?或者这可能是我的逻辑?

【问题讨论】:

  • 我不明白。请提供一些示例输入调用以及您希望从这些调用的结果中看到的内容

标签: r matrix dataframe


【解决方案1】:

以下似乎有效:

library(matrixStats) #for rowMedians
my_Func1<-function(arg1, arg2=1){

  A<-data.matrix(arg1)

  if(arg2==1){
    return(colnames(arg1))
  }
  else if (arg2==2){
    colMeans(A)
  }
  else if (arg2==3){
    rowMedians(A)
    #or use apply(A, 1, median) 
    #if you don't want to use the matrixStats package
    #result is the same
  }
  else{
    stop("The value must be 1, 2, or 3")
  }

}

举个例子:

df <- data.frame(a=runif(100), b=runif(100))

输出:

#returns colnames
my_Func1(df)
[1] "a" "b"

#returns col means
my_Func1(df,2)
        a         b 
0.5115115 0.5179713 

#returns rowMedians
my_Func1(df,3)
 [1] 0.6095942 0.8047744 0.9322312 0.7202797 0.4061614 0.9268534 0.6453481 0.6332645 0.3356115 0.6845784 0.3562386 0.8149613 0.3368132
 [14] 0.3943005 0.4082845 0.6249351 0.7483373 0.7649562 0.5062454 0.4025369 0.4864001 0.4748679 0.5620104 0.9720910 0.3495394 0.8274248
 [27] 0.4315357 0.2935979 0.4365097 0.6043698 0.4077471 0.2718737 0.6230104 0.5795740 0.3220522 0.3377562 0.4806867 0.4550451 0.8740976
 [40] 0.7058154 0.4779405 0.5774614 0.6220152 0.4811471 0.3716731 0.4404327 0.6374183 0.4995577 0.2696681 0.5154605 0.1612755 0.5637899
 [53] 0.5148926 0.2683836 0.5989326 0.5168307 0.6084937 0.1851450 0.8010263 0.4063176 0.2227938 0.5751372 0.4599596 0.4134101 0.6519764
 [66] 0.7971018 0.3114643 0.2374720 0.8218233 0.9588351 0.7158696 0.6633277 0.4514450 0.2356745 0.5297823 0.4686703 0.3113826 0.2800651
 [79] 0.4709474 0.4831431 0.3746795 0.2379049 0.2086487 0.2870380 0.6961195 0.6039862 0.5702595 0.7620196 0.5670314 0.4874534 0.2331586
 [92] 0.4843724 0.6366822 0.5150960 0.4336061 0.2913745 0.4006255 0.4996965 0.6356846 0.4182479

#returns error
my_Func1(pval,4)
Error in my_Func1(df, 4) : The value must be 1, 2, or 3

在您的代码中,您使用的是else 而不是else if,并且您还打开左大括号{ 并用括号) 关闭它们。此外,如果参数 2 不是 1 或 2 或 3 时您想要一个错误,那么您需要函数 stop

【讨论】:

  • 没有 matrixStats 库你能表达吗?
  • 如果没有 matrixStats 库,这段代码会是什么样子?
  • 我更新了答案。如果您不想使用 matrixStats 包,请使用 apply(A, 1, median) 而不是 rowMedians(A)。结果是一样的。
  • 但是 apply 函数不是仅限于 n x n 矩阵吗?在 k 不必等于 n 的情况下,这是否适用于 n × k?
  • 是的,它适用于任何矩阵,无论尺寸如何。它适用于我的示例,矩阵为 100x2。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 2021-12-25
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多