我有下面的R码可以用,但速度很慢.我想根据R数据帧中现有列的值创建一个新列.但有一个问题/复杂之处,我需要访问和更改一个全局环境变量,该变量保存观察之间的比较值. 我使用APPLY和数据帧的行上的一个函数来完成这项工作.该函数可以读写外部变量.这很管用,但速度很慢.有没有办法加快这一进程?
第一次观察的药物价值为起始基准值. 我try 做的是标记观察(药价),它们不同于base_value,并且不是base_value的子字符串.然后,该观察的药价成为当前的BASE_VALUE,该过程继续.在下面的示例中,数据集第三行中的第二个"苹果酱"值不应该被标记,因为它出现在第一行中.这说明我需要以某种方式存储第一行的值,并能够将其与第三行进行比较.这就是为什么使用滞后值不起作用,以及我为什么使用BASE_VALUE变量的原因.事实上,我最初试图使用滞后值,直到我意识到这一点.
可重现的代码如下:
base_value <- ""
char_vector <- c("applesauce", "apple", "applesauce", "orange", "orange", "banana", "applepie")
#change char_vector to a dataframe, the lastone column isn't completely necessary
df = data.frame(drug = char_vector) %>%
mutate(lastone = lag(drug))
test_func <- function(row, output){
if (is.na(row[2])){
#this is the first observation - set the drug value as BASE_VALUE
base_value <<- row[1]
return("Y")
}else if (!is.na(row[2]) & row[1] != base_value & !grepl(row[1], base_value, fixed = TRUE)) {
base_value <<- row[1]
return("Y")
}else {
return("N")
}
}
switches <- apply(df, 1, test_func)
cbind(df, switches = switches)
在上面试过了,它起作用了.但想要加快速度