sourcecode

행렬 또는 데이터 프레임의 모든 행에 함수 적용

codebag 2023. 7. 2. 19:27
반응형

행렬 또는 데이터 프레임의 모든 행에 함수 적용

2차원 행렬과 2-벡터를 인수 중 하나로 사용하는 함수가 있다고 가정합니다.행렬의 각 행에 함수를 적용하여 n-벡터를 얻고 싶습니다.R에서 이것을 어떻게 합니까?

예를 들어, 다음 세 가지 점에서 2D 표준 정규 분포의 밀도를 계산하려고 합니다.

bivariate.density(x = c(0, 0), mu = c(0, 0), sigma = c(1, 1), rho = 0){
    exp(-1/(2*(1-rho^2))*(x[1]^2/sigma[1]^2+x[2]^2/sigma[2]^2-2*rho*x[1]*x[2]/(sigma[1]*sigma[2]))) * 1/(2*pi*sigma[1]*sigma[2]*sqrt(1-rho^2))
}

out <- rbind(c(1, 2), c(3, 4), c(5, 6))

각 행에 기능을 적용하는 방법out?

지정한 방식으로 함수에 점 이외의 다른 인수 값을 전달하는 방법은 무엇입니까?

당신은 단순히 사용합니다.apply()함수:

R> M <- matrix(1:6, nrow=3, byrow=TRUE)
R> M
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
R> apply(M, 1, function(x) 2*x[1]+x[2])
[1]  4 10 16
R> 

행렬을 사용하여 각 행에 (무작위) 함수를 적용합니다.함수에 추가 인수를 네 번째, 다섯 번째, ... 인수로 전달합니다.apply().

합 또는 평균과 같은 일반적인 함수를 적용하려면 다음을 사용해야 합니다.rowSums또는rowMeans그들이 더 빠르기 때문에.apply(data, 1, sum)접근.그렇지 않으면 다음을 수행합니다.apply(data, 1, fun)FUN 인수 뒤에 추가 인수를 전달할 수 있습니다(Dirk가 이미 제안한 대로).

set.seed(1)
m <- matrix(round(runif(20, 1, 5)), ncol=4)
diag(m) <- NA
m
     [,1] [,2] [,3] [,4]
[1,]   NA    5    2    3
[2,]    2   NA    2    4
[3,]    3    4   NA    5
[4,]    5    4    3   NA
[5,]    2    1    4    4

그런 다음 다음과 같은 작업을 수행할 수 있습니다.

apply(m, 1, quantile, probs=c(.25,.5, .75), na.rm=TRUE)
    [,1] [,2] [,3] [,4] [,5]
25%  2.5    2  3.5  3.5 1.75
50%  3.0    2  4.0  4.0 3.00
75%  4.0    3  4.5  4.5 4.00

다음은 행렬의 각 행에 함수를 적용하는 간단한 예입니다. (여기서 적용되는 함수는 모든 행을 1로 정규화합니다.)

참고: 결과는 다음과 같습니다.apply()을 사용하여 전치되어야 했습니다.t()입력 행렬과 동일한 레이아웃을 얻는 방법A.

A <- matrix(c(
  0, 1, 1, 2,
  0, 0, 1, 3,
  0, 0, 1, 3
), nrow = 3, byrow = TRUE)

t(apply(A, 1, function(x) x / sum(x) ))

결과:

     [,1] [,2] [,3] [,4]
[1,]    0 0.25 0.25 0.50
[2,]    0 0.00 0.25 0.75
[3,]    0 0.00 0.25 0.75

적용은 작업을 잘 수행하지만 속도가 상당히 느립니다.sapply와 vapply를 사용하는 것이 유용할 수 있습니다. dplyr의 rowwise 또한 유용할 수 있습니다. 모든 데이터 프레임의 rowwise 제품을 수행하는 방법에 대한 예를 보겠습니다.

a = data.frame(t(iris[1:10,1:3]))
vapply(a, prod, 0)
sapply(a, prod)

vapply/sapply/apply를 사용하기 전에 변수에 할당하는 것이 시간을 많이 단축하기 때문에 좋은 방법입니다.마이크로벤치마크 결과를 보겠습니다.

a = data.frame(t(iris[1:10,1:3]))
b = iris[1:10,1:3]
microbenchmark::microbenchmark(
    apply(b, 1 , prod),
    vapply(a, prod, 0),
    sapply(a, prod) , 
    apply(iris[1:10,1:3], 1 , prod),
    vapply(data.frame(t(iris[1:10,1:3])), prod, 0),
    sapply(data.frame(t(iris[1:10,1:3])), prod) ,
    b %>%  rowwise() %>%
        summarise(p = prod(Sepal.Length,Sepal.Width,Petal.Length))
)

t()가 어떻게 사용되고 있는지 주의 깊게 살펴봅니다.

첫 번째 단계는 함수 객체를 만들고 적용하는 것입니다.행 수가 같은 행렬 객체를 원하는 경우 미리 정의하고 그림과 같이 객체[] 형식을 사용할 수 있습니다. 그렇지 않으면 반환된 값이 벡터로 단순화됩니다.

bvnormdens <- function(x=c(0,0),mu=c(0,0), sigma=c(1,1), rho=0){
     exp(-1/(2*(1-rho^2))*(x[1]^2/sigma[1]^2+
                           x[2]^2/sigma[2]^2-
                           2*rho*x[1]*x[2]/(sigma[1]*sigma[2]))) * 
     1/(2*pi*sigma[1]*sigma[2]*sqrt(1-rho^2))
     }
 out=rbind(c(1,2),c(3,4),c(5,6));

 bvout<-matrix(NA, ncol=1, nrow=3)
 bvout[] <-apply(out, 1, bvnormdens)
 bvout
             [,1]
[1,] 1.306423e-02
[2,] 5.931153e-07
[3,] 9.033134e-15

기본 매개 변수 이외의 다른 매개 변수를 사용하려면 함수 뒤에 명명된 인수를 호출해야 합니다.

bvout[] <-apply(out, 1, FUN=bvnormdens, mu=c(-1,1), rho=0.6)

apply()는 고차원 배열에서도 사용할 수 있으며 MAX 인수는 단일 정수일 뿐만 아니라 벡터일 수 있습니다.

값하려는 또 은 단값일대데집다부양한분사방은또식접다근른는려용하을합의신이터▁another은방▁if식▁instead▁dataset▁to▁of▁use접근▁a단▁is▁you다▁approach른일또▁portion▁varying▁the▁want는▁to▁value값▁use사▁single용▁of를 사용하는 것입니다.rollapply(data, width, FUN, ...)폭 벡터를 사용하면 데이터 집합의 다양한 창에 함수를 적용할 수 있습니다.저는 이것을 적응형 필터링 루틴을 구축하는 데 사용했지만, 그다지 효율적이지는 않습니다.

Applyr을 이용한 across,rowSums그리고.rowMeans.

M <- matrix(1:9, nrow=3, byrow=TRUE)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

M %>% as_tibble() %>%
  rowwise() %>% 
  mutate(sum = rowSums(across(where(is.numeric)))) %>% 
  mutate(mean = rowMeans(across(V1:V3))) %>%
  mutate(Max = max(V1:V3)) %>%
  mutate(Min = min(V1:V3)) %>%
  as.matrix()

     V1 V2 V3 sum mean Max Min
[1,]  1  2  3   6    2   3   1
[2,]  4  5  6  15    5   6   4
[3,]  7  8  9  24    8   9   7

언급URL : https://stackoverflow.com/questions/4236368/apply-a-function-to-every-row-of-a-matrix-or-a-data-frame

반응형