여러 데이터 프레임이 있고 각각에 대해 (여러) 다른 모델을 평가하고 싶습니다. MWE
df1 <- data.frame(A3 = c(-5, 5, 1),
B3 = c(0, 10, 1))
df2 <- data.frame(A4 = c(5, 15, 1))
B4 = c(10, 20, 1))
myfun <- function(arg1, arg2){ # arg1 =1 or 2
if (arg2 == 1){
eqn <- paste0("A", arg1+2) ~ paste0("B", arg1+2) + I(as.name(paste0("B", arg1+2))^2)
} else {
eqn <- paste0("A", arg1+2) ~ paste0("B", arg1+2) + I(as.name(paste0("B", arg1+2))^2) +I(as.name(paste0("B", arg1+2))^3)
}
return (lm(formula = eqn, data = eval(as.name(paste0("df", arg1)))
)
)
}
예를 들어 내가 실행 myfun(1,2)
하면 lm(A4 ~ B4 + I(B4^2) + I(B4^3), data = df2)
. 그러나 내가 무엇을 시도하든 다음과 같은 오류 메시지가 나타납니다 Error in (paste0("B", arg1 +2))^2 : non-numeric argument to binary operator
. 내가 읽은 내용에서 ?I
R이 전달되는 모든 것을 분리하기 때문에 이것이 I()
변수를 변환하려는 것을 깨닫지 못하기 때문이라고 생각합니다.이게 무슨 일이 일어나고 있는지, 내가 고칠 수있는 것입니까? 또한 여러 모델을 빠르게 추정하는 더 좋은 방법이 있습니까? 내가 찾은 모든 유사한 질문 data.frame
은 모델간에 동일하게 사용되는 반면, 서로 다른 모델에 대해 서로 다른 데이터 프레임에서 오는 반응 (및 예측 변수) 변수를 설명해야합니다.
아마도 이것은 당신이 찾고있는 것입니다.
문제는 문자열에 대해 수학 연산을 수행하고 있다는 것입니다. 즉 (paste0("B", arg1 +2))^2
, 문자열을 제곱하려고 시도하면 오류가 발생합니다. Inytead는 다음을 통해 수식을 문자열로 간단히 붙일 수 있으며 다음을 통해 수식으로 변환 할 수 있습니다 as.formula
.
df1 <- data.frame(A3 = c(-5, 5, 1),
B3 = c(0, 10, 1))
df2 <- data.frame(A4 = c(5, 15, 1))
B4 = c(10, 20, 1)
myfun <- function(arg1, arg2){ # arg1 =1 or 2
if (arg2 == 1){
eqn <- paste0("A", arg1+2, " ~ B", arg1+2," + I(B", arg1+2, "^2)")
} else {
eqn <- paste0("A", arg1+2, " ~ B", arg1+2," + I(B", arg1+2, "^2) + I(B", arg1+2, "^3)")
}
return (lm(formula = as.formula(eqn), data = eval(as.name(paste0("df", arg1)))
)
)
}
myfun(2, 1)
#>
#> Call:
#> lm(formula = as.formula(eqn), data = eval(as.name(paste0("df",
#> arg1))))
#>
#> Coefficients:
#> (Intercept) B4 I(B4^2)
#> 0.84795 0.12281 0.02924
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다