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)