楼主: Ning_1
17338 9

[问答] R语言矩阵中等于0和不等于0的数如何分别计算 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

高中生

22%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
186 点
帖子
21
精华
0
在线时间
6 小时
注册时间
2015-11-14
最后登录
2016-3-17

楼主
Ning_1 发表于 2015-11-14 23:28:27 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
菜鸟求大神指导,R语言计算,h矩阵中存在值为0的数。想计算这个公式:P <- 16*(10*Jan/h)^A。如果h为0则P为0,如果h不等于0则P按上面的公式求,应该如何做?
二维码

扫码加我 拉你入群

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

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

关键词:R语言 如何

回帖推荐

prunusis 发表于3楼  查看完整内容

P

沙发
jiangbeilu 学生认证  发表于 2015-11-15 00:08:56
应该还有简便的计算方法,这里是把0先处理成NA,然后再转成0处理的,代码如下:
  1. h=matrix(9:0,5)
  2. zerof <- function(x){
  3. x[which(x==0)]<- NA
  4. x1<-1/x
  5. x1[is.na(x1)]<-0
  6. return(x1)
  7. }
  8. apply(1/h,2,zerof)
复制代码
已有 2 人评分经验 论坛币 热心指数 收起 理由
李会超 + 60 + 10 精彩帖子
ryoeng + 1 热心帮助其他会员

总评分: 经验 + 60  论坛币 + 10  热心指数 + 1   查看全部评分

藤椅
prunusis 发表于 2015-11-15 09:21:34
P <- 16*(10*Jan/h)^A
P[h == 0] = 0
已有 1 人评分论坛币 收起 理由
李会超 + 40 精彩帖子

总评分: 论坛币 + 40   查看全部评分

板凳
jiangbeilu 学生认证  发表于 2015-11-15 12:48:13
prunusis 发表于 2015-11-15 09:21
P
这个是简便方法,不错

报纸
Ning_1 发表于 2015-11-15 16:10:54
jiangbeilu 发表于 2015-11-15 00:08
应该还有简便的计算方法,这里是把0先处理成NA,然后再转成0处理的,代码如下:
谢谢!

地板
Ning_1 发表于 2015-11-15 16:11:49
jiangbeilu 发表于 2015-11-15 12:48
这个是简便方法,不错
谢谢!

7
cheetahfly 在职认证  发表于 2015-11-16 09:11:24
这是一个典型的可以用ifelse()函数的案例,ifelse能够将矩阵作为向量来处理:
  1. p <- ifelse(h==0, 0, 16*(10*Jan/h)^A)
复制代码

8
prunusis 发表于 2015-11-17 13:52:30
cheetahfly 发表于 2015-11-16 09:11
这是一个典型的可以用ifelse()函数的案例,ifelse能够将矩阵作为向量来处理:
ifelse不是向量化的所以速度会比较慢

x = 1:10000000

system.time({
  y = x * 2
  y[x %% 2 == 0] = 0
})

system.time(ifelse(x %% 2 == 0, 0, x * 2))

9
cheetahfly 在职认证  发表于 2015-11-17 14:53:58
这里引申出另外一个问题,向量化计算的方法不止一种,相互之间速度也是有差异的,不能简单地认为相对较慢的那种方法就不是向量化的方法。

ifesle()是向量化的方法,我举两个论据:

第一是John M. Chambers在其著作“Software for Data Analysis Programming with R”(
https://bbs.pinggu.org/thread-3716983-1-1.html)中有一小节专门系统地阐述“向量化”的问题,其中P159页第一段是这么叙述的——
“Functions that operate efficiently on whole objects to produce other
whole objects, usually of the same size and structure; examples include
the arithmetic and other binary operators, numerical transformation,
sorting and ordering computations, and some specialized filtering func-
tions, such as ifelse().”

第二是观察ifelse函数的源代码:
  1. function (test, yes, no)
  2. {
  3.     if (is.atomic(test)) {
  4.         if (typeof(test) != "logical")
  5.             storage.mode(test) <- "logical"
  6.         if (length(test) == 1 && is.null(attributes(test))) {
  7.             if (is.na(test))
  8.                 return(NA)
  9.             else if (test) {
  10.                 if (length(yes) == 1 && is.null(attributes(yes)))
  11.                   return(yes)
  12.             }
  13.             else if (length(no) == 1 && is.null(attributes(no)))
  14.                 return(no)
  15.         }
  16.     }
  17.     else test <- if (isS4(test))
  18.         as(test, "logical")
  19.     else as.logical(test)
  20.     ans <- test
  21.     ok <- !(nas <- is.na(test))
  22.     if (any(test[ok]))
  23.         ans[test & ok] <- rep(yes, length.out = length(ans))[test &
  24.             ok]
  25.     if (any(!test[ok]))
  26.         ans[!test & ok] <- rep(no, length.out = length(ans))[!test &
  27.             ok]
  28.     ans[nas] <- NA
  29.     ans
  30. }
复制代码
会发现,基本上都是一系列的判断,是将test参数作为一个logical向量来对待的,没有将test参数按照长度来循环。这也是向量化计算的特征。

10
prunusis 发表于 2015-11-17 17:09:05
cheetahfly 发表于 2015-11-17 14:53
这里引申出另外一个问题,向量化计算的方法不止一种,相互之间速度也是有差异的,不能简单地认为相对较慢的 ...
嘛,原因没有深究说错了,不过很慢还是事实...

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 10:11