【发布时间】:2012-08-09 20:40:28
【问题描述】:
我正在尝试对 R 中数据框的每一行进行计算,并将计算结果作为新列添加到框架中。我开始使用“by”函数,但计算速度非常慢,所以我改用“apply”函数。我想它的工作方式是使用我的函数运行 apply,将输出保存到变量并将该数据附加到原始数据帧。
我创建了一个函数来计算保险计划的期限长度并返回该值,该函数在样本数据集上运行良好。当我使用较大的数据集时,出现“无法分配大小的向量 ...”的错误。我知道很多人建议使用更多的 RAM,但我已经有 16GB 的内存,并且在 R 中加载了整个数据集,我的计算机说它只使用了 7.7GB 的内存。该数据集有 44 列,约 1100 万条记录,所以我看不到再添加一列数据会占用 8GB 内存吗?
朝着正确方向的任何一点都会很棒。
以下是我正在使用的功能:
get_term_length <- function(row_data){
# convert values to dates
expiration_date <- as.Date( row_data[42] )
start_date <- as.Date( row_data[43] )
cancellation_date <- as.Date( row_data[44] )
# check to see if the cancellation date is NA - just use entire policy length
if( is.na(cancellation_date) ){
return( expiration_date - start_date) )
}
# check to see if policy was cancelled early
if(cancellation_date < expiration_date){
return( cancellation_date - start_date )
}
# the policy was for the entire term
else{
return( expiration_date - start_date )
}
}
我一直通过调用来运行函数:
tmp <- apply(policy_data, 1, get_term_length)
【问题讨论】:
-
查看
data.table和运算符:=(例如,使用标签[r]和[data.table]在SO 上搜索)。 -
要点:R 本质上是一种函数式语言 -> 通常,函数不会就地修改对象 -> 修改你说的那个 7.7Gb 数据框?当然!我会准备一个副本来工作! -> 你现在已经填满了超过 15Gb。砰! (专家,请不要吹毛求疵!我保持基本。)
-
感谢joran的解释;这就说得通了。我假设 apply 只会将行对象的副本传递给函数,但我猜不是。
-
基本问题可能是您熟悉 SAS 或 SPSS 的 IF 函数的隐式循环。 R if()函数不执行循环操作,所以需要使用ifelse()。
标签: r data.table