>

함수를 실행하는 방법을 배우고 있습니다. 이 질문에 대답하기 쉬운 질문이 되길 바랍니다.

나는 df 그리고 나는 기능을 전달하고 싶다 w df의 일부 변수에.

df <- data.frame(id= c(1,1,1,2,2,2,3,3,3), time=c(1,2,3,1,2,3,1,2,3),y = rnorm(9), x1 = rnorm(9), x2 = c(0,0,0,0,1,0,1,1,1),c2 = rnorm(9))
library(data.table)
library(dplyr)
w<-function(data,y,x){
  x <- substitute(x)
  y <- substitute(y)
  data<-setDT(data)[,paste("times",(y), (x), sep = "_"):=eval(y)*eval(x)]
}
df2<- w(df,y,x1) 

함수를 단일 변수에 적용하면 함수가 작동합니다. 그러나 내 데이터 프레임의 일련의 변수에 적용하려고하지만 어떤 이유로 여러 변수에 한 번에 적용하려고하면 함수가 실패합니다. 아무도 내가 어떻게 작동시킬 수 있는지 알고 있습니까?

지금까지 나는 다음을 시도했다.

vars<-c("x1","x2")
df3<- lapply(vars, function(x) w(df,y, x))

도와 주셔서 정말로 고맙습니다


  • 답변 # 1

    data.table 변수 이름과 잘 작동합니다. 너는 사용한다 get 이름의 인용을 해제하고 data.table 목적. 나는 그것이 당신을 도울 수 있다면 그 주제에 대해 정확하게 블로그 게시물을 썼습니다.

    df <- data.frame(id= c(1,1,1,2,2,2,3,3,3), time=c(1,2,3,1,2,3,1,2,3),y = rnorm(9), x1 = rnorm(9), x2 = c(0,0,0,0,1,0,1,1,1),c2 = rnorm(9))
    library(data.table)
    setDT(df)
    
    

    귀하의 기능은 다음과 같이 단순화 될 수 있습니다 :

    w <- function(data, var1, var2){
      if (!inherits(data, "data.table")){
            setDT(data)
      }
      data[,(paste("times",var1,var2, sep = "_")) := get(var1)*get(var2)]
    }
    
    

    변수 이름을 사용하여 호출합니다.

    vars<-c("x1","x2")
    lapply(vars, function(x) w(df,"y", x))
    
    df
       id time           y         x1 x2          c2 times_y_x1 times_y_x2
    1:  1    1 -0.81438357  0.4493933  0 -0.39143328 -0.3659786  0.0000000
    2:  1    2  0.36358498 -1.3574671  0  0.06062278 -0.4935547  0.0000000
    3:  1    3  0.04049807  0.2860555  0  1.58123937  0.0115847  0.0000000
    4:  2    1  0.15490901 -0.8654069  0 -1.09874917 -0.1340593  0.0000000
    5:  2    2 -0.87899821  0.2863604  1 -0.73161360 -0.2517103 -0.8789982
    6:  2    3  0.37881104  1.6135654  0  1.30268569  0.6112364  0.0000000
    7:  3    1 -0.72990680  0.5867623  1  0.41856548 -0.4282818 -0.7299068
    8:  3    2 -0.53344035  0.5073415  1  0.64326809 -0.2706364 -0.5334404
    9:  3    3 -0.27674109 -0.5226920  1 -2.28723895  0.1446504 -0.2767411
    
    

    사용하기 때문에 데이터 프레임을 업데이트하십시오. := 따라서 출력을 다시 할당 할 필요가 없습니다

관련 자료

  • 이전 android - 렌더링 문제 해결 방법 Pathop ()가 지원되지 않습니까?
  • 다음 r - ggplot으로 히스토그램을 만드는 문제