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
기능성.
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
'programing' 카테고리의 다른 글
XML 사이트 맵에 대해 어떤 Content-Type 값을 보내야 합니까? (0) | 2023.10.29 |
---|---|
C++에 가장 적합한 오픈 XML 파서는 무엇입니까? (0) | 2023.10.29 |
모드별 _full_group_only의 이점은 무엇입니까? (0) | 2023.10.29 |
REST API woecommerce - GET/고객의 모든 고객에게 표시되지 않음 (0) | 2023.10.29 |
View 작성 시 Oracle 오류 - ORA-01720 (0) | 2023.10.29 |