programing

R 특정 데이터 프레임 열에 적용() 함수

bestprogram 2023. 10. 29. 19:54

R 특정 데이터 프레임 열에 적용() 함수

데이터 프레임에 적용 기능을 사용하고 싶은데 마지막 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)})

이는 y의 4-9열에만 A를 적용하지만, B의 총 반환은 처음 3열에서 분리됩니다.저는 여전히 그것들을 원합니다, 단지 A가 적용되는 것을 원하지 않습니다.

wifi[,1:3]+B 

또한 제가 기대했던/원했던 것을 하지 못합니다.

lapply아마도 그것보다 더 나은 선택일 것입니다.apply여기, apply가 먼저 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:8)
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x)

예제 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

이 작업은 다음과 같이 쉽게 수행할 수 있습니다.dplyr꾸러미의across기능성.

Late mail에서 제시한 데이터 구조 차용하기:

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

함수를 적용할 열을 다음과 같이 색인별로 나타낼 수 있습니다.

library(dplyr)
wifi %>% 
   mutate(across(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

또는 이름:

wifi %>% 
   mutate(across(X4:X9, 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

언급한 바와 같이, 당신은 단지 표준 R을 원합니다.apply열에 적용되는 함수(MARGIN=2):

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

또는 줄여서:

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

다음을 사용하여 4:9 열을 제자리로 업데이트합니다.A()기능.자, 이제, 예를 들어,na.rm에 대한 논쟁입니다.A(), 당연히 그래야 할 겁니다통과할 수 있습니다.na.rm=T계산에서 NA 값을 제거하려면 다음과 같이 하십시오.

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

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

가장 쉬운 방법은 돌연변이 함수를 사용하는 것입니다.

dataFunctionUsed <- data %>% 
  mutate(columnToUseFunctionOn = function(oldColumn ...))

당신이 원하는 것은 maply라고 생각합니다.함수를 모든 열에 적용한 다음 원하지 않는 열을 삭제할 수 있습니다.그러나 다른 열에 다른 함수를 적용하는 경우 dplyr 패키지에서 변형된 것을 원하는 것 같습니다.

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