首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化R函数,将新列添加到data.frame

优化R函数,将新列添加到data.frame
EN

Stack Overflow用户
提问于 2009-12-29 22:47:20
回答 2查看 1K关注 0票数 0

我有一个函数,目前在函数模型中编程,我想要加快它的速度,或者在R的精神中更好地解决问题。我有一个data.frame,希望根据信息添加一列,其中每个条目都依赖于两行。目前,它看起来如下所示:

代码语言:javascript
复制
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))
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-29 23:01:43

我不能在没有样本数据的情况下对此进行测试,但这是一般的想法。通过使用&| ( &&||的矢量化版本),可以完全避免执行&&循环。此外,如果只有一个值(true或false),则不需要if-else语句。

代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2010-01-07 20:46:02

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

代码语言:javascript
复制
isPulse <- function(previous, current)
{ 
  (previous != 0 & current !=0 & (abs(previous-current) < 20)) |
  (previous == 0 & current !=0)
}

请注意,这里使用的是向量|而不是布尔||

然后调用它,提供两个向量流'previous‘和'current’偏移适当的延迟,在本例中为1:

代码语言:javascript
复制
delay <- 1
samples = length(heartData$pulse)

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

让我们在一些虚构的数据上尝试一下:

代码语言:javascript
复制
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))]代码从末尾裁剪delay样本,对于当前流,heartData$pulse[-(1:delay)]从开始裁剪delay样本。

手动操作,结果应该是(使用F表示false,使用T表示true)

代码语言:javascript
复制
F,T,T,T,F,F,F,T,F

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

代码语言:javascript
复制
> print(result)
FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE

成功!

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

代码语言:javascript
复制
resultPadded <- c(rep(FALSE,delay), result)
heartData$result = ifelse(resultPadded, 1, 0)

这给了我们

代码语言:javascript
复制
> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1974998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档