我有下面的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)

在上面试过了,它起作用了.但想要加快速度

推荐答案

您可以使用purrr包中的accumulate来跟踪base_value,然后判断其中的变化:

library(purrr)
library(dplyr)
char_vector <- c("applesauce", "apple", "applesauce", "orange", "orange", "banana", "applepie")
    
new_base <- function(old_base, value) {
  if (grepl(value, old_base, fixed = TRUE)) {
    return(old_base)
  } else {
    return(value)
  }
}

tibble(X = char_vector) %>%
mutate(base_value = accumulate(X, new_base),
       changed = ifelse(base_value != lag(base_value, default = ""),
                        "Y", "N"))
X          base_value   changed
applesauce applesauce   Y
apple      applesauce   N
applesauce applesauce   N
orange     orange       Y
orange     orange       N
banana     banana       Y
applepie   applepie     Y

值为accumulate时,函数返回的值将作为第一个参数输入到下一次迭代中,并且...累加到最终结果中,该结果将在递归结束时返回.就像cumsum一样,例如

R相关问答推荐

将带有范围的字符串转换为R中的数字载体

在特定列上滞后n行,同时扩展框架的长度

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

R箱形图gplot 2 4组但6个参数

如何对数据集进行逆向工程?

如何在R中添加截止点到ROC曲线图?

如何使用按钮切换轨迹?

将向量组合到一个数据集中,并相应地命名行

在R中将特定列的值向右移动

多个过滤器内的一个盒子在仪表板Quarto

使用data.table::fcase()而不是dplyr::case_When()时保持值

计算两列中满足特定条件连续行之间的平均值

基于Key->Value数据帧的基因子集相关性提取

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

如何在使用箭头R包(箭头::OPEN_DATASSET)和dplyr谓词时编写具有整齐计算的函数?

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

如何平滑或忽略R中变量的微小变化?

多元正态分布的计算

ggplot斜体轴刻度标签中的单个字符-以前的帖子建议不工作

将美学添加到ggploy中的文本标签