【发布时间】:2016-03-31 16:14:24
【问题描述】:
我正在尝试提高我必须相对经常运行的基本任务的性能。我有一个看起来像这样的数据框“测试”:
pair_id rr im db
1 A0A0B5JQ66_A0A0B5JFG2 NA yes NA
2 A0A024RA76_A0A024RA76 NA yes NA
3 A0A068F1B9_A0A068F1B9 NA yes NA
4 A0A098_A0A098 NA yes NA
5 A0A0B5JJY8_A0A0B5JFB4 yes NA NA
6 A0A0B5JK11_A0A0B5JK11 yes NA NA
7 A0A0B5JK74_A0A0B5JFG2 yes NA NA
8 A0A0B5JK74_A0A0B5JK74 yes NA NA
9 A0A0B5JKA2_A0A0B5JF96 NA yes NA
10 A0A0B5JKA2_A0A0B5JK74 NA yes NA
11 A0A0B5JPZ7_A0A0B5JFG2 yes yes NA
12 A0A0B5JPZ7_A0A0B5JK74 NA yes NA
13 A0A0B5JPZ7_A0A0B5JKA2 NA yes NA
14 A0A0B5JPZ7_A0A0B5JPZ7 NA yes NA
15 A0A0B5JQ10_A0A0B5JK95 yes yes NA
16 A0A0B5JQ14_A0A0B5JFB4 NA yes NA
17 A0A0B5JQ25_A0A0B5JFB4 NA yes NA
18 A0A0B5JQ25_A0A0B5JFB8 NA yes NA
19 A0A0B5JQ25_A0A0B5JK29 NA yes NA
20 A0A0B5JQ29_A0A0B5JQ14 yes NA NA
我需要比较第 2 列和第 3 列('rr' 和 'im'),然后根据此比较为第 4 列设置一个值。为此,我创建了以下名为“比较”的函数:
compare <- function(v){
if (v[1]=="yes" & is.na(v[2])){
db <- "rr"
}
else if (v[2]=="yes" & is.na(v[1])){
db <- "im"
}
else if (v[1]=="yes" & v[2]=="yes"){
db <- "both"
}
else {
db <- "check"
}
db
}
它只需要一个包含两个元素的向量作为输入,检查哪一个的值为“yes”,哪一个为空(如果有),并返回一个可以分配给第三列的值。
现在我一直在使用 for 循环在“测试”中使用它:
for (i in 1:nrow(test)){
test[i,]$db <- compare(test[i,2:3])
}
但是,当我的数据帧变得很大(我必须管理一些超过 700000 行的数据帧)并且需要大量时间来计算时,此解决方案的效率非常低。我一直在尝试在“应用”系列的不同变体下使用我的函数,但无法使其工作,因为我是 R 新手,而且我对这组函数没有太多经验。关于可以提高性能的替代方案的任何提示?
【问题讨论】:
标签: r performance for-loop apply