R의 데이터 프레임에서 행별 최대 절대 값 찾기
이 기사에서는 R의 데이터 프레임에서 행별로 최대 절대 값을 찾는 방법을 설명합니다.
사용자 지정 함수를 사용하여 R 데이터 프레임에서 행별 최대 절대 값 찾기
다음 코드 스 니펫에서 구현 한abs_max
함수를 사용하여 데이터 프레임의 각 행에서 최대 절대 값을 찾아 벡터로 구성 할 수 있습니다. 데이터 프레임에 숫자 및 비 숫자 값이 포함되어 있다고 가정하고 확인을 위해df1
이라는 객체를 초기화합니다. abs_max
블록에서 호출되는 첫 번째 함수는Filter
입니다. 두 가지 인수가 필요합니다. 첫 번째는 두 번째 인수로 전달 된 벡터의 각 요소에 적용된 단항 함수를 나타내고Filter
는true
를 평가하는 요소를 추출합니다. 이 경우Filter
는is.numeric
함수를 사용하여 데이터 프레임에서 숫자 값만 추출합니다.
그런 다음inherits
함수를 사용하여abs_max
의 인수가tbl_df
유형인지 확인하고, 그렇다면 매트릭스로 변환합니다. tbl_df
클래스는 일반적으로tibble
으로 알려져 있으며 별도의 패키지에서 동일한 이름으로 제공되며 다음 예에서 활용할 것입니다. replace
함수는 음수 값을 절대 값으로 바꾸고NA
유형을-Inf
로 바꾸기 위해 호출됩니다. 다음으로max.col
이 호출되고 각 행의 최대 값에 대한 위치 벡터를 추출합니다. 마지막으로cbind
함수를 사용하여 결과 값을 가져옵니다. 후자의 객체는 다음 코드 샘플에 설명 된대로abs_max
라는 별도의 열로 기존 데이터 프레임에 추가 할 수 있습니다.
abs_max <- function(data) {
tmp <- Filter(is.numeric, data)
if(inherits(data, "tbl_df")) {
tmp <- as.matrix(tmp)
}
tmp[cbind(1:nrow(tmp), max.col(replace(x <- abs(tmp), is.na(x), -Inf)))]
}
df1 <- data.frame(
id = c("foo", "bar", "goo"),
val_a = c(-51, 15, 19),
val_b = c(NA, 122, 35),
val_c = c(10, -23, 4)
)
df1$abs_max = abs_max(df1)
df1
출력:
id val_a val_b val_c abs_max
1 foo -51 NA 10 -51
2 bar 15 122 -23 122
3 goo 19 35 4 35
또는 동일한 함수를 사용하여tibble
개체 유형을 전달하고 해당 행을 처리 할 수 있습니다. tibbles는abs_max
함수에서 행렬로 변환되지만 나머지 함수 코드는 데이터 프레임에서와 동일한 방식으로 작동합니다.
library(tibble)
abs_max <- function(data) {
tmp <- Filter(is.numeric, data)
if(inherits(data, "tbl_df")) {
tmp <- as.matrix(tmp)
}
tmp[cbind(1:nrow(tmp), max.col(replace(x <- abs(tmp), is.na(x), -Inf)))]
}
tb1 <- tibble(
id = c("foo", "bar", "goo"),
val_a = c(-51, 15, 19),
val_b = c(NA, 122, 35),
val_c = c(10, -23, 4)
)
tb1$abs_max = abs_max(tb1)
tb1
출력:
# A tibble: 3 x 5
id val_a val_b val_c abs_max
<chr> <dbl> <dbl> <dbl> <dbl>
1 foo -51 NA 10 -51
2 bar 15 122 -23 122
3 goo 19 35 4 35
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook