R의 데이터 프레임에서 행별 최대 절대 값 찾기

Jinku Hu 2021년7월14일
R의 데이터 프레임에서 행별 최대 절대 값 찾기

이 기사에서는 R의 데이터 프레임에서 행별로 최대 절대 값을 찾는 방법을 설명합니다.

사용자 지정 함수를 사용하여 R 데이터 프레임에서 행별 최대 절대 값 찾기

다음 코드 스 니펫에서 구현 한abs_max함수를 사용하여 데이터 프레임의 각 행에서 최대 절대 값을 찾아 벡터로 구성 할 수 있습니다. 데이터 프레임에 숫자 및 비 숫자 값이 포함되어 있다고 가정하고 확인을 위해df1이라는 객체를 초기화합니다. abs_max블록에서 호출되는 첫 번째 함수는Filter입니다. 두 가지 인수가 필요합니다. 첫 번째는 두 번째 인수로 전달 된 벡터의 각 요소에 적용된 단항 함수를 나타내고Filtertrue를 평가하는 요소를 추출합니다. 이 경우Filteris.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
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - R Data Frame