对行及其 data.table 中的等效函数应用用户定义的函数

Nic*_*cso 1 r data.table

我找不到原因Test1,并且Data$Test1在我的代码中不相同。见下文;

library("data.table")

Data <- fread("
V1 V2 V3
14   24.70762         17.3329292
8   25.01303         19.7530632
1   18.87427         -0.7832386
14   23.43488         14.9795652
14   24.43762         20.7145533
8   29.85930          3.7763770
17   27.66289          1.8315841
1   21.28808         79.7883210
1   24.55836         70.0779117
1   13.01046         27.3039891")

Function <- function(v1, v2, v3){
    
    ff <- function(wt){
            mod2 <- 1.399666
            j2 <- -0.4142602
            alpha <- 0.895474
            
            X_mu <- ifelse(wt >= j2*100,
                           wt - j2*100, 
                           0)
            mia <- X_mu/(alpha*100)
            weibull <- mod2/(alpha*100) * mia^(mod2 - 1) *
                exp(-mia^mod2)    
            return(weibull)
        }        
    my.f.si <- function(wt){
            epsilon = 0.008213571
            
            fnl <- (ff(wt) / epsilon)
            return(fnl)
        }

    SiS <- lapply(1:5, function(XX){
        pot = c(0.1012141, 0.1012141, 0.1410539,
                0.1581489, 0.1775243)
        theta0 = c(-3.651407, -3.651407, -3.804682,
                   -3.607503, -3.603890)
        theta1 = 0.2181257
        
        Pot <- pot[XX]
        The0 <- theta0[XX]
        The1 <- theta1
        
        Si <- 6 + (Pot*100 - 6) *
            my.f.si(wt = v3) *
            ((1 + exp(-(The0 + The1 * v2)))^-1)
        
        return(Si)
    })
    SiS <- do.call("c", SiS)
    
    MiN <- abs((SiS - v1) / v1)
  
    ## return(MiN)
    GetQ <- which(MiN == min(MiN))
    LengTh <- length(GetQ)
    return(LengTh)
}

##################################
Test1 <- sapply(1:nrow(Data), function(T){
    Function(v1 = Data[T, V1],
             v2 = Data[T, V2],
             v3 = Data[T, V2])})

##################################
Data[, Test1 := Function(v1 = V1,
                         v2 = V2,
                         v3 = V2)]

##################################
Test1
Data$Test1


Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们可以按行顺序进行分组

Data[, Test1 := Function(V1, V2, V2), by = 1:nrow(Data)]
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是Vectorize函数并直接应用

Data[, Test1 := Vectorize(Function)(V1, V2, V2)]
Run Code Online (Sandbox Code Playgroud)

-检查

> Data$Test1
 [1] 1 2 2 1 1 2 1 2 2 2
> Test1
 [1] 1 2 2 1 1 2 1 2 2 2
Run Code Online (Sandbox Code Playgroud)