我在列中有数据需要进行计算。是否可以使用以前的行值而不使用循环来执行此操作?例如。如果在第一列中值为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
所以在这个数据集中你会这样做:
139
列ID
Data
中的最后5行的返回平均值(给出4.2
)PF
5行以上的值的效果返回到当前值(给出152%
)如果我要做一个循环,它看起来像这样:
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将在数据集中多次出现。
非常感谢。 卡洛斯
答案 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
列的更改率(即您所谓的效果)。