作者gsuper (Logit(odds))
看板R_Language
标题Re: [讨论] for loop与*apply function请益
时间Fri May 22 14:33:19 2015
assign.group <- function(value){
if(value < 0.25){return_value <- "group1"}
else if(value < 0.5){return_value <- "group2" }
else if(value < 0.75){return_value <- "group3" }
else return_value <- "group4"
return_value
}
## 新增栏位并填入值
add.col.group <- function(data){
data$group <- 0
data$group <- sapply(
data$avg, assign_group) ##avg即为第八个栏位的名称
data
}
-----------------------------------------------------
当你喂进去的变数是单纯的 numeric 是最快的
但是看起来你喂进去的是 factor 而非 numeric
-----------------------------------------------------
首先看看你的 data 变数, 看起来应该是 class::dataframe
然後你使用了 data$avg, 这边应该预设是 class::factor
(你 avg 本来应该是用做 numeric 而非 factor)
这代表当你用 sapply() 放进 20000 笔资料, 每个 factor 又会产生 20000 笔 level
这时你就使用了 20000*20000 的记忆体容量
你可以试试把 data$avg 事先拉出来 宣告为 numeric
原则上 factor 只用在统计的线性模型, 有很多预设的性质, 不利简单计算与资料处理
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.32.201.238
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1432276402.A.8BC.html
※ 编辑: gsuper (114.32.201.238), 05/22/2015 14:37:56
※ 编辑: gsuper (114.32.201.238), 05/22/2015 16:17:52
1F:→ celestialgod: 如果用factor,还能产生出正常结果吗? 05/22 19:35
2F:→ gsuper: 有时候可以 但容易出bug 所以我一像都会避开这种格式 05/22 23:51
3F:→ celestialgod: 恩恩,我只是想说factor通常被当成1,2,3,... 05/22 23:53
4F:→ celestialgod: 不确定double变成factor是否可以一样的数值运算 05/22 23:53
5F:→ celestialgod: 我自己run是会出现错误In Ops.factor(a, 0.25) : 05/22 23:54
6F:→ celestialgod: ‘>’ not meaningful for factors 05/22 23:55
7F:→ gsuper: as.numeric(as.matrix(factor)) 我都是这样宣告的 05/22 23:55
8F:→ gsuper: 不用去管float, double, numeric, integer 等细节 05/22 23:56
9F:→ celestialgod: R应该不会自动把double转成factor才是。 05/22 23:56
10F:→ gsuper: 因为 read.table 会预设是dataframe 05/22 23:56
11F:→ gsuper: 然後dataframe$vector 好像大部分是预设 factor 05/22 23:57
12F:→ gsuper: 但是细节我也不清楚 所以读取档案以後 一定会这样写 05/22 23:57
13F:→ celestialgod: 这个你应该误会了吧 05/22 23:58
14F:→ gsuper: gsub("^ *| *$","",as.matrix(read.table("档案"))) 05/22 23:58
15F:→ celestialgod: R只会自动转换文字到factor,整数还是维持整数 05/22 23:58
16F:→ gsuper: 那我之後测试看看... factor的属性我不是很熟 05/22 23:59
17F:→ celestialgod: 我自己测试是只有character会自动转换 05/23 00:00
18F:→ celestialgod: read.table有一个option是as.is 可以设定是否要转 05/23 00:01
19F:→ gsuper: 不过我觉得原po 的问题主因可能还是喂 factor 给 sapply() 05/23 00:03
20F:→ gsuper: 因为这状况我碰过很多次 05/23 00:03
21F:→ celestialgod: data$avg预设是factor,我觉得怪怪,可以再讨论 05/23 00:04
22F:→ gsuper: 给他测试看看罗...原po试试 class(data$avg) 05/23 00:04
23F:→ gsuper: 告诉我们结果是什麽 05/23 00:05
24F:→ celestialgod: 不过至少,没有转换过的factor,'>'是不能用 05/23 00:05
25F:→ locka: 抱歉这麽晚回,因为今天我比较晚回来,明天又要早起,所以 05/23 00:16
26F:→ locka: 暂时无法测试…各位大大的回馈我都会一一测试消化,不过我 05/23 00:16
27F:→ locka: 这里可以先跟g大补充一下,如果我没记错的话,我data$avg 05/23 00:16
28F:→ locka: 的资料是有前处理转成numeric的 所以应该不是喂factor的问 05/23 00:16
29F:→ locka: 题? 05/23 00:16