Development Tip

특정 데이터 프레임 열에 대한 R Apply () 함수

yourdevel 2020. 11. 17. 21:12
반응형

특정 데이터 프레임 열에 대한 R Apply () 함수


데이터 프레임에서 적용 기능을 사용하고 싶지만 마지막 5 개 열에 만 기능을 적용합니다.

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)})

이것은 y의 모든 열에 A를 적용합니다.

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)})

이것은 A를 y의 4-9 열에 만 적용하지만 B의 총 수익은 처음 3 개 열에서 제거됩니다. 저는 여전히 그것들을 원합니다. 저는 A가 적용되는 것을 원하지 않습니다.

wifi[,1:3]+B 

또한 내가 기대 / 원했던 일을하지 않습니다.


예제 data.frame 및 예제 함수 사용 (모든 값에 +1 만)

A <- function(x) x + 1
wifi <- data.frame(replicate(9,1:4))
wifi

#  X1 X2 X3 X4 X5 X6 X7 X8 X9
#1  1  1  1  1  1  1  1  1  1
#2  2  2  2  2  2  2  2  2  2
#3  3  3  3  3  3  3  3  3  3
#4  4  4  4  4  4  4  4  4  4

data.frame(wifi[1:3], apply(wifi[4:9],2, A) )
#or
cbind(wifi[1:3], apply(wifi[4:9],2, A) )

#  X1 X2 X3 X4 X5 X6 X7 X8 X9
#1  1  1  1  2  2  2  2  2  2
#2  2  2  2  3  3  3  3  3  3
#3  3  3  3  4  4  4  4  4  4
#4  4  4  4  5  5  5  5  5  5

또는:

data.frame(wifi[1:3], lapply(wifi[4:9], A) )
#or
cbind(wifi[1:3], lapply(wifi[4:9], A) )

#  X1 X2 X3 X4 X5 X6 X7 X8 X9
#1  1  1  1  2  2  2  2  2  2
#2  2  2  2  3  3  3  3  3  3
#3  3  3  3  4  4  4  4  4  4
#4  4  4  4  5  5  5  5  5  5

lapplyapplyapply first가 data.frame을 배열로 강제 변환하므로 모든 열이 동일한 유형을 가져야하기 때문에 여기 보다 더 나은 선택 일 것 입니다. 상황에 따라 의도하지 않은 결과가 발생할 수 있습니다.

패턴은 다음과 같습니다.

df[cols] <- lapply(df[cols], FUN)

'cols'벡터는 변수 이름 또는 인덱스 일 수 있습니다. 가능할 때마다 이름을 사용하는 것을 선호합니다 (열 재정렬에 강력 함). 따라서 귀하의 경우 이것은 다음과 같습니다.

wifi[4:9] <- lapply(wifi[4:9], A)

열 이름 사용의 예 :

wifi <- data.frame(A=1:4, B=runif(4), C=5:9)
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x)

언급했듯이 apply열 ( MARGIN=2)에 적용되는 표준 R 함수 를 원합니다 .

wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A)

또는 짧게 :

wifi[,4:9] <- apply(wifi[,4:9], 2, A)

이렇게하면 A()함수를 사용하여 열 4 : 9 제자리에서 업데이트 됩니다. 이제 그것이 아마도되어야 할 na.rm인수 라고 가정 해 봅시다 A(). 다음 na.rm=T과 같이 계산에서 NA 값을 제거하도록 전달할 수 있습니다 .

wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A, na.rm=T)

사용자 지정 함수에 전달하려는 다른 인수도 마찬가지입니다.


I think what you want is mapply. You could apply the function to all columns, and then just drop the columns you don't want. However, if you are applying different functions to different columns, it seems likely what you want is mutate, from the dplyr package.

참고URL : https://stackoverflow.com/questions/18503177/r-apply-function-on-specific-dataframe-columns

반응형