使用前一行值而不使用循环计算列

时间:2016-08-03 12:35:45

标签: r

我在列中有数据需要进行计算。是否可以使用以前的行值而不使用循环来执行此操作?例如。如果在第一列中值为139,则计算最后5个值的中位数以及上面5行值和当前行中值的变化百分比?

ID  Data    PF
135 5       123
136 4       141
137 5       124
138 6       200
139 1       310
140 2       141
141 4       141

所以在这个数据集中你会这样做:

  1. 139
  2. 中查找ID
  3. Data中的最后5行的返回平均值(给出4.2
  4. PF 5行以上的值的效果返回到当前值(给出152%
  5. 如果我要做一个循环,它看起来像这样:

    for (i in 1:nrow(data)){
      if(data$ID == "139" & i>=3) 
        {data$New_column <- data[i,"PF"] / data[i-4,"PF"] - 1
    }
    

    问题是由于许多数据点,循环时间过长。 ID 139将在数据集中多次出现。

    非常感谢。 卡洛斯

3 个答案:

答案 0 :(得分:2)

正如Tutuchacn和Sotos所指出的那样,使用包zoo来获取您查询的最后N行(包括行)中mean的{​​{1}}(假设您的数据位于数据框Data)中:

df

library(zoo) ind <- which(df$ID==139) ## this is the row you are querying N <- 5 ## here, N is 5 res <- rollapply(df$Data, width=N, mean)[ind-(N-1)] print(res) ## [1] 4.2 返回rollapply(..., mean)窗口数据的滚动平均值。请注意,用于查询width=N输出的索引滞后rollapply,因为滚动均值在系列中向前应用。

要按照您的指定获得N-1的效果百分比:

PF

在这里,我们定义一个函数percent.performance <- function(x) { z <- zoo(x) ## create a zoo series lz <- lag(z,4) ## create the lag version return(z/lz - 1) } res <- as.numeric(percent.performance(df$PF)[ind]) print(res) ## [1] 1.520325 ,它返回计算有意义的所有percent.performance行的所需内容。然后,我们使用df提取我们想要的行并将其转换为数字。

希望这有帮助。

答案 1 :(得分:0)

这就是你想要的吗?

String.Join

答案 2 :(得分:0)

这可能是一个不错的开始:

mytext = "ID,Data,PF
135,5,123
136,4,141
137,5,124
138,6,200
139,1,310
140,2,141
141,4,141"

mydf <- read.table(text=mytext, header = T, sep = ",")

do.call(rbind,lapply(mydf$ID[which(mydf$ID==139):nrow(mydf)], function(x) {
    tempdf <- mydf[1:which(mydf$ID==x),]
    data.frame(ID=x,Data=mean(tempdf$Data),PF=100*(tempdf[nrow(tempdf),"PF"]-tempdf[(nrow(tempdf)-4),"PF"])/tempdf[(nrow(tempdf)-4),"PF"])
}))

ID     Data        PF
139 4.200000 152.03252
140 3.833333   0.00000
141 3.857143  13.70968

这里的想法是:你从{139}开始从{139}到最后,并通过生成一个临时data.frame来使用每个ID函数,其中包括上面的所有行特别lapply(包括ID本身)。然后,您可以获取ID列的平均值以及Data列的更改率(即您所谓的效果)。