楼主: ywh19860616
2214 6

[问答] 如何用apply或者此类函数实现 [推广有奖]

已卖:3份资源

学术权威

32%

还不是VIP/贵宾

-

威望
0
论坛币
725 个
通用积分
4318.4410
学术水平
867 点
热心指数
1004 点
信用等级
649 点
经验
116372 点
帖子
3968
精华
0
在线时间
7743 小时
注册时间
2009-9-3
最后登录
2025-9-7

楼主
ywh19860616 发表于 2016-3-19 18:49:49 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. myfun <- function(x,y) {
  2. return(x[,y]/x[,y-1])
  3. }
  4. m1 = matrix(c(1,2,3,4,5,6,7,8,9),nrow=3)
  5. myfunc(m1,2)
复制代码
现在想用apply函数实现,但是下面的代码提示错误
  1. apply(m1,1,myfunc,y=2)
复制代码
谢谢各位指教!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:apply appl 如何用 App Fun 如何

一份耕耘,一份收获。

沙发
jiangbeilu 学生认证  发表于 2016-3-19 23:02:48
首先,一个是myfunc,一个是myfun,肯定会出问题。

其次,myfun函数里,操作对象是matrix,而apply函数是以matrix里的一列或者一行为对象,将myfun作用于matrix的函数,放到apply里,肯定出错。显示
  1. Error in x[, y] : incorrect number of dimensions
复制代码

所以,你需要考虑用别的方法来实现你的目的。而你的目的从给定的信息判断,并不明显,所以请多加思考些。
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
求证1加1 + 1 + 1 热心帮助其他会员
ywh19860616 + 5 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 2  热心指数 + 2  信用等级 + 1   查看全部评分

藤椅
ywh19860616 发表于 2016-3-20 08:21:07
jiangbeilu 发表于 2016-3-19 23:02
首先,一个是myfunc,一个是myfun,肯定会出问题。

其次,myfun函数里,操作对象是matrix,而apply函数是 ...
@jiangbeilu,谢谢您
那个函数写错了,不好意思!
比如现在有一个矩阵,我想实现的是矩阵的每两列比值,如我例子中的,
  1. myfun <- function(x,y) {
  2. return(x[,y]/x[,y-1])
  3. }

  4. ##我的想法是x是矩阵,就变动y,就可以计算不同列的比值

  5. m1 = matrix(c(1,2,3,4,5,6,7,8,9),nrow=3)
  6. myfun(m1,2)
复制代码
上面就是第2列和第1列的比值,但是我不想用循环去实现,想用apply函数或者此类函数
请教有可以简单实现的吗?
已有 1 人评分论坛币 热心指数 收起 理由
jiangbeilu + 10 + 2 鼓励积极发帖讨论

总评分: 论坛币 + 10  热心指数 + 2   查看全部评分

板凳
jiangbeilu 学生认证  发表于 2016-3-20 09:52:22
建议你理解一下apply函数的用法,及与循环的关系。
apply能替代循环,可以理解成:
在执行的时候,apply将矩阵的很多列或者行,作为一个单独的对象,参与到计算中,然后最后每一行或者每一列的操作结果,返回一个对应的内容。
并不参完成你所说的问题,你的问题是两层循环。
矩阵方面的相关函数我不太熟悉,不过你可以用组合函数,也就是从n列中,每次选择2列,这样的排列或者组合结果,然后再代入矩阵进行行列计算即可。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
ywh19860616 + 5 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

报纸
ywh19860616 发表于 2016-3-20 11:33:30
jiangbeilu 发表于 2016-3-20 09:52
建议你理解一下apply函数的用法,及与循环的关系。
apply能替代循环,可以理解成:
在执行的时候,apply将 ...
嗯,明白,您的建议也是一种选择方案,很好!
谢谢,最近正在学习apply函数,就想到这样一个问题。

地板
qoiqpwqr 发表于 2016-3-20 18:16:39
如果你只想求出该矩阵中后一列和前一列的比,直接可以用

m1[, -1]/m1[, -ncol(m1)]
已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
ywh19860616 + 5 + 1 + 1 + 1 谢谢
求证1加1 + 1 -1 我很赞同
jiangbeilu + 10 + 1 热心帮助其他会员

总评分: 论坛币 + 15  学术水平 + 2  热心指数 + 1  信用等级 + 1   查看全部评分

7
cheetahfly 在职认证  发表于 2016-3-21 08:43:44
楼上的应该是最优解。

我多说几句,楼主之所以用apply解决不了,因为这个问题是涉及两个向量的对应运算,对应要用apply家族中的mapply(),比如:
mapply(function(x, y) x/y, mat[,-1], mat[,-ncol(mat)])
当然,由于本楼的问题比较简单,可以完全向量化,还是用楼上方法吧。
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
ywh19860616 + 5 + 1 + 1 + 1 精彩帖子
jiangbeilu + 10 + 2 鼓励积极发帖讨论

总评分: 论坛币 + 15  学术水平 + 1  热心指数 + 3  信用等级 + 1   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-6 10:39