입력 벡터를 취하고 입력을 기반으로 데이터 프레임을 만들고 일부 값을 최적화 한 다음이 값 중 일부를 반환하는 코드를 만들었습니다. 지금은 이것을 입력 데이터 프레임에 대해 행 방향으로 적용하는 함수로 바꾸고 있습니다. 아래는 내가 달성하고자하는 것의 예를 작업 최소가 (내 실제 기능은 여기에 공유하는 데 시간이 너무 오래 될 것이다!) : 당신이 볼 수 있듯이, 나는 각각의 새로운 df$mean
개별 기능을 적용 할 수 없습니다사용자 정의 함수에서 데이터 프레임에 여러 열을 추가하는 방법 R
# Randomly generated dataframe
df <- data.frame(a = rnorm(10, 0, 1), x = rnorm(10, 1, 3), y = rnorm(10, 2, 3))
# Function that takes multiple arguments and returns multiple values in a list
zsummary <- function(x, y) {
if (y < 0) return(list(NA, NA))
z = rnorm(10, x, abs(y))
return(list(mean(z), sd(z)))
}
# Example of something that works using dplyr
# However, this results in a lot of function calls...
# especially if there were a lot of columns in the list...
library(dplyr)
df %>% rowwise() %>%
mutate(mean = zsummary(x,y)[[1]], sd = zsummary(x,y)[[1]])
및 dfsd
열은 z
벡터에만 의존하므로 한 번 생성 할 수 있습니다. 나는 이미 주위를 둘러 보았지만 아직 답을 찾을 수 없었다. 나는 해결책이 apply
함수 중 하나를 사용하고 dplyr
에서 무언가를 사용하지 않을 것이라고 생각하지만 솔직히 완전히 이해했습니다. apply
함수. 나는 또한 이 아닌이 인 for
루프를 사용하는 솔루션을 좋아할 것입니다. 이전 프로젝트에서 이것을 시도한 적이 있으며 대용량 데이터 프레임의 경우 매우 느립니다!
답장을 보내 주셔서 감사합니다. x와 y를 다룰 수있는 다른 방법이 있습니까? 내 실제 입력에는 12 개 정도의 열이 있으므로 colnames와 같은 것을 사용하면 mapply에서 내 함수를 사용하려고 할 때마다 입력 $ a, 입력 $ b, 입력 $ c를 저장하는 데 아주 좋을 것입니다. – Alwin
@ Alwin 데이터 집합의 열과 같은 단일 인수를 취하여 내부에서 처리하는 방식으로 함수를 만들 수 있습니다. 더 좋을 수도 있습니다. – akrun
+1 또한 대답을 upvote하기에 충분한 담당자가 없으므로. 아무 것도 없으면 정답으로 받아 들일 것입니다. – Alwin