R lappy内部值的替代
是否可以在R lappy内部值的替代,r,functional-programming,R,Functional Programming,是否可以在lappy(或类似)函数内执行替换 我经常遇到这样的情况,根据某个键,我希望转换data.frame/xts对象的某些元素 目前,我使用for循环来实现这一点,如下所示: set.seed(1) dx2 <- dx <- xts(data.frame(uni = runif(10), nrm = rnorm(10), uni2 = runif(10) - 0.5,
lappy
(或类似)函数内执行替换
我经常遇到这样的情况,根据某个键,我希望转换data.frame
/xts
对象的某些元素
目前,我使用for
循环来实现这一点,如下所示:
set.seed(1)
dx2 <- dx <- xts(data.frame(uni = runif(10),
nrm = rnorm(10),
uni2 = runif(10) - 0.5,
nrm2 = rnorm(10) - 0.5),
order.by = Sys.Date() + 1:10)
key_dx <- data.frame(dd = sample(index(dx), 4),
repTest = sample(c(TRUE, FALSE), 4, rep=TRUE),
colNum = 1:4,
refNum = c(3,4,1,2))
for (i in 1:nrow(key_dx)) {
if(key_dx$repTest[i]) {
dx[key_dx$dd[i], key_dx$colNum[i]] <- 100 + dx[key_dx$dd[i], key_dx$refNum[i]]^2
}
}
set.seed(1)
dx2主要问题是分别返回已更改的行,然后将它们绑定到不需要更改的行。我认为这实际上比你的循环版本更难阅读
do.call(rbind, # rbind all rows
# only consider rows with repTest=TRUE
c(lapply(which(key_dx$repTest), function(i) {
# change rows
dx[key_dx$dd[i], key_dx$colNum[i]] <-
100 + dx[key_dx$dd[i], key_dx$refNum[i]]^2
# return the changed row
dx[key_dx$dd[i], ]
}),
# return all rows that didn't change
list(dx[!index(dx) %in% key_dx$dd[key_dx$repTest], ])
))
do.call(rbind,#rbind所有行
只考虑具有RepTest=真的行
c(lappy)(其中(键dx$repTest),函数(i){
#换行
dx[key\u dx$dd[i],key\u dx$colNum[i]]您也可以使用plyr
(比使用lappy()
结果更简洁):
require(plyr)
ORIGFRAME这听起来像是数据.table
--即数据.frame
的完美用例,您可以通过引用更新其列。您可以使用全局赋值运算符(@kevinushey请显示data.table解决方案?+1/已接受。感谢您提供了如何在lappy
中替换的示例--我一直在处理assign
的问题,但未能将其全部解决。
require(plyr)
origframe<-data.frame(dd=index(dx),dx) # original data
editframe<-merge(key_dx,origframe,by="dd") # merge wiyh key_dx to bring
# conditional data into the rows
editframe<-editframe[editframe$repTest,] # only test TRUE
editframe<-adply(editframe,1,function(x){ # modify subset rows in adply call
x[as.numeric(x["colNum"])+4]<-100 + # +4 adusts col index
as.numeric(x[as.numeric(x["refNum"])+4])^2 # +4 adusts col index
return(x)
})[,c(1,5:ncol(editframe))]
updatedframe<-rbind(editframe,origframe[origframe$dd%notin%editframe$dd,])
# then back to ts
dx2<-xts(updatedframe[,c("uni","nrm","uni2","nrm2")],order.by=updatedframe$dd)