楼主: luorongjin
1818 3

[学习分享] R语言知识介绍----优化代码方法 [推广有奖]

  • 1关注
  • 6粉丝

已卖:651份资源

副教授

6%

还不是VIP/贵宾

-

威望
0
论坛币
7111 个
通用积分
12.2590
学术水平
7 点
热心指数
19 点
信用等级
5 点
经验
912 点
帖子
301
精华
0
在线时间
941 小时
注册时间
2010-4-25
最后登录
2024-12-27

楼主
luorongjin 发表于 2016-5-25 18:30:11 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
大家好,今天给大家带来的主题是:代码优化,提高for 循环的速度
  1. # Create the data frame
  2. col1 <- runif (12^5, 0, 2)
  3. col2 <- rnorm (12^5, 0, 2)
  4. col3 <- rpois (12^5, 3)
  5. col4 <- rchisq (12^5, 2)
  6. df <- data.frame (col1, col2, col3, col4)
复制代码

逐行判断该数据框 (df) 的总和是否大于 4 ,如果该条件满足,则对应的新变量数值为greaterthan4,否则赋值为 lesserthan4’。

几种方法的比较:

方法一:

  1. # Original R code: Before vectorization and pre-allocation
  2. system.time({
  3.   for (i in 1:nrow(df)) { # for every row
  4.     if ((df[i, 'col1'] + df[i, 'col2'] + df[i, 'col3'] + df[i, 'col4']) > 4) { # check if > 4
  5.       df[i, 5] <- "greater_than_4" # assign 5th column
  6.     } else {
  7.       df[i, 5] <- "lesser_than_4" # assign 5th column
  8.     }
  9.   }
  10. })
  11. -------------速度超级慢
复制代码

方法二:向量化思想


先定义好变量,并先附上初始值;再把判断条件写在外面判定好,最后进入循环。

  1. output <- c(rep("lesser_than_4", nrow(df)))
  2. condition <- (df$col1 + df$col2 + df$col3 + df$col4) > 4
  3. system.time({
  4.     for (i in (1:nrow(df))[condition]) {  # run loop only for true conditions
  5.         if (condition[i]) {
  6.             output[i] <- "greater_than_4"
  7.         }
  8.     }
  9.     df$output
  10. })
复制代码

方法三:使用ifelse

  1. system.time({
  2.   output <- ifelse ((df$col1 + df$col2 + df$col3 + df$col4) > 4, "greater_than_4", "lesser_than_4")
  3.   df$output <- output
  4. })
复制代码

方法四:使用which语句

  1. # Thanks to Gabe Becker
  2. system.time({
  3.   want = which(rowSums(df) > 4)
  4.   output = rep("less than 4", times = nrow(df))
  5.   output[want] = "greater than 4"
  6. })
复制代码

方法五:使用apply族函数替代for循环

  1. # apply family
  2. system.time({
  3.   myfunc <- function(x) {
  4.     if ((x['col1'] + x['col2'] + x['col3'] + x['col4']) > 4) {
  5.       "greater_than_4"
  6.     } else {
  7.       "lesser_than_4"
  8.     }
  9.   }
  10.   output <- apply(df[, c(1:4)], 1, FUN=myfunc)  # apply 'myfunc' on every row
  11.   df$output <- output
  12. })
复制代码

总结:大家可以分别用上述方法去尝试下,看下时间。一般而言应尽量避免for,能用隐式循环尽量用;另外,如果要用到for的话,尽量在for循环之间把结果的类型、长度和初始值都定义好,这样能大大减少系统开支。


二维码

扫码加我 拉你入群

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

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

关键词:R语言 Create Frame creat Data R语言 提高for 循环的速度

沙发
zl66983279 在职认证  发表于 2016-5-26 10:09:26
这个对新手很有帮助,帮顶

藤椅
lyxxxz 发表于 2016-5-26 12:03:43
谢谢,这个很有帮助

板凳
改改改呀 发表于 2020-9-22 15:44:26
thank you!

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

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