0

我有一个功能,目前在功能模型中编程,或者想要加快它的速度,或者本着 R 的精神更多地解决问题。我有一个 data.frame,想添加一个基于信息的列,这是每个条目取决于两行。目前它看起来如下所示:

faultFinging <- function(heartData){
    if(heartData$Pulse[[1]] == 0){
        Group <- 0
    }
    else{
        Group <- 1
    }
    for(i in seq(2, length(heartData$Pulse), 1)){
        if(heartData$Pulse[[i-1]] != 0 
            && heartData$Pulse[[i]] != 0
            && abs(heartData$Pulse[[i-1]] - heartData$Pulse[[i]])<20){
            Group[[i]] <- 1
        }
        else{
            if(heartData$Pulse[[i-1]] == 0 && heartData$Pulse[[i]] != 0){
                Group[[i]] <- 1
            }
            else{
                Group[[i]] <- 0
            }
        }
    }
    Pulse<-heartData$Pulse
    Time<-heartData$Time
    return(data.frame(Time,Pulse,Group))
}
4

2 回答 2

2

如果没有样本数据,我无法对此进行测试,但这是一般的想法。for()您可以通过使用&and来完全避免循环,它们是and|的矢量化版本。此外,如果只有一个值(真或假),则不需要 if-else 语句。&&||

faultFinging <- function(heartData){
    Group <- as.numeric(c(heartData$Pulse[1] != 0,
      (heartData$Pulse[-nrow(heartData)] != 0 
        & heartData$Pulse[-1] != 0
        & abs(heartData$Pulse[-nrow(heartData)] - heartData$Pulse[-1])<20) |
      (heartData$Pulse[-nrow(heartData)] == 0 & heartData$Pulse[-1] != 0)))
    return(cbind(heartData, Group))
}

放置as.numeric()索引会将 TRUE 设置为 1,将 FALSE 设置为 0。

于 2009-12-29T15:01:43.440 回答
1

这可以通过将您的程序分成两部分来以更矢量的方式完成:首先是一个函数,它需要两个时间样本并确定它们是否符合您的脉冲规范:

isPulse <- function(previous, current)
{ 
  (previous != 0 & current !=0 & (abs(previous-current) < 20)) |
  (previous == 0 & current !=0)
}

注意使用 vector|而不是 boolean ||

然后调用它,通过适当的延迟(在您的情况下为 1)提供两个矢量流“先前”和“当前”偏移:

delay <- 1
samples = length(heartData$pulse)

isPulse(heartData$pulse[-(samples-(1:delay))], heartData$pulse[-(1:delay)])

让我们在一些虚构的数据上试试这个:

sampleData = c(1,0,1,1,4,25,2,0,25,0)
heartData = data.frame(pulse=sampleData)
result = isPulse(heartData$pulse[-(samples-(1:delay))], heartData$pulse[-(1:delay)])

请注意,对于前一个流,代码从末尾heartData$pulse[-(samples-(1:delay))]修剪样本,并从当前流的开头修剪样本。delayheartData$pulse[-(1:delay)]delay

手动执行,结果应该是(F用于 false 和Ttrue)

F,T,T,T,F,F,F,T,F

通过运行它,我们发现它们是!:

> print(result)
FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE

成功!

由于您想将这些作为列绑定到原始数​​据集中,因此您应该注意新数组的delay元素比原始数据短,因此您需要在开始时使用延迟 FALSE 元素填充它。您可能还想根据您的数据将其转换为 0,1:

resultPadded <- c(rep(FALSE,delay), result)
heartData$result = ifelse(resultPadded, 1, 0)

这使

> heartData
   pulse result
1      1      0
2      0      0
3      1      1
4      1      1
5      4      1
6     25      0
7      2      0
8      0      0
9     25      1
10     0      0
于 2010-01-07T12:46:01.697 回答