楼主: 李会超
4950 8

[问答] 有条件的求和问答 [推广有奖]

  • 1关注
  • 31粉丝

已卖:1167份资源

教授

33%

还不是VIP/贵宾

-

威望
0
论坛币
121240 个
通用积分
62.1000
学术水平
140 点
热心指数
152 点
信用等级
84 点
经验
56173 点
帖子
1180
精华
1
在线时间
1120 小时
注册时间
2008-11-6
最后登录
2024-4-29

楼主
李会超 发表于 2014-12-23 11:45:43 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
刚才在sas区看到有一个小问题,蛮有意思,看着sas代码好晦涩,特发帖到R里看看大家怎么处理,是这样的,数据集里有两个变量:a和b
a是一个0,1变量,现在希望求:所有a=1时相应b在这个位置的值与后5个的B的和。

模拟数据代码如下
ex<-data.frame(a=round(runif(100),0),b=runif(100))
例如第二行的a等于1,那么求第二行的b的值以及其后面五行b的值之和。
二维码

扫码加我 拉你入群

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

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

关键词:sas代码 模拟数据 怎么处理 有意思 小问题

本帖被以下文库推荐

学无止境,坚持!

沙发
水天一色DIY 在职认证  发表于 2014-12-23 12:28:47
第一种方法用,循环,简单
  1. c <- rep(0,nrow(ex))
  2. attach(ex)
  3. for(i in 1:nrow(ex)){
  4.         c[i] <- ifelse(a[i]==1,sum(b[i:(i+5)]),0)
  5.                         }
  6. detach(ex)
复制代码

第二种方法,矩阵,高效
建立一个0,1矩阵,从而计算每一行b值及后5行b值之和,挑选a=1的所有行。
ps:这类型0,1矩阵生成感觉比较麻烦,可以直接生成5个伪向量,粗暴好用
  1. b1 <- ex$b
  2. b2 <- c(b1[-1],0);b3 <- c(b2[-1],0);b4 <- c(b3[-1],0);b5 <- c(b4[-1],0);b6 <- c(b5[-1],0)
  3. b <- data.frame(b1,b2,b3,b4,b5,b6)
  4. c2 <- rowSums(b)
复制代码
第一种方法实现5.82秒,第二种方法实现0.50秒
已有 1 人评分经验 论坛币 收起 理由
李会超 + 60 + 40 观点有启发

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

藤椅
qoiqpwqr 发表于 2014-12-23 21:56:32
或者:

  1. f <- function(n) sum(b[n:(n+5)])
  2. f <- Vectorize(f)
  3. c3 <- f(1:95)
复制代码

板凳
李会超 发表于 2014-12-24 09:43:23
水天一色DIY 发表于 2014-12-23 12:28
第一种方法用,循环,简单

第二种方法,矩阵,高效
第二种方法和sas的思路比较像

报纸
水天一色DIY 在职认证  发表于 2014-12-24 10:15:55
qoiqpwqr 发表于 2014-12-23 21:56
或者:
恩,这种方法有想过,但是如上面的第一种方法一样,还是遇到sum(b[i:(i+5)])溢出问题

地板
kaifengedu 发表于 2014-12-24 10:41:24
水天一色DIY 发表于 2014-12-24 10:15
恩,这种方法有想过,但是如上面的第一种方法一样,还是遇到sum(b)溢出问题
你可以试试
  1. c[i] <- ifelse(a[i]==1,sum(b[i:(i+5)], na.rm=TRUE),0)
复制代码

7
水天一色DIY 在职认证  发表于 2014-12-24 11:32:30
kaifengedu 发表于 2014-12-24 10:41
你可以试试

8
qoiqpwqr 发表于 2014-12-24 20:12:45
水天一色DIY 发表于 2014-12-24 10:15
恩,这种方法有想过,但是如上面的第一种方法一样,还是遇到sum(b)溢出问题
什么是溢出问题?我试的时候没有任何问题啊

9
水天一色DIY 在职认证  发表于 2014-12-24 21:30:33
qoiqpwqr 发表于 2014-12-24 20:12
什么是溢出问题?我试的时候没有任何问题啊
就是只能实现f(1:95),96-100不能计算,不过后面na.rm=T可以解决的

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

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