programing

조건부 값을 사용한 dplyrutation

abcjava 2023. 7. 10. 21:57
반응형

조건부 값을 사용한 dplyrutation

열이 네 개인 대형 데이터 프레임("myfile")에서 처음 네 개 열을 기준으로 조건부로 값이 포함된 다섯 번째 열을 추가해야 합니다.

다음 항목에 대한 답변dplyr그리고.mutate주로 대규모 데이터 세트에서 속도가 빠르기 때문입니다.

데이터 프레임은 다음과 같습니다.

  V1 V2 V3 V4
1  1  2  3  5
2  2  4  4  1
3  1  4  1  1
4  4  5  1  3
5  5  5  5  4
...

다섯 번째 열(V5)의 값은 일부 조건부 규칙을 기반으로 합니다.

if (V1==1 & V2!=4) {
  V5 <- 1
} else if (V2==4 & V3!=1) {
  V5 <- 2
} else {
  V5 <- 0
}

이제 사용하고 싶습니다.mutate(느린 루프를 방지하기 위해) 모든 행에서 이러한 규칙을 사용하는 함수입니다.이와 같은 것입니다(그리고 네, 이런 식으로 작동하지 않는다는 것을 알고 있습니다!):

myfile <- mutate(myfile, if (V1==1 & V2!=4){V5 = 1}
    else if (V2==4 & V3!=1){V5 = 2}
    else {V5 = 0})

결과는 다음과 같습니다.

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

작업 방법dplyr?

사용해 보십시오.

myfile %>% mutate(V5 = (V1 == 1 & V2 != 4) + 2 * (V2 == 4 & V3 != 1))

제공:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

또는 다음과 같습니다.

myfile %>% mutate(V5 = ifelse(V1 == 1 & V2 != 4, 1, ifelse(V2 == 4 & V3 != 1, 2, 0)))

제공:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

메모

당신의 데이터 프레임에 더 나은 이름을 제안합니다. 제 파일은 마치 파일 이름을 포함하는 것처럼 보이게 합니다.

위에서 사용한 입력:

myfile <- 
structure(list(V1 = c(1L, 2L, 1L, 4L, 5L), V2 = c(2L, 4L, 4L, 
5L, 5L), V3 = c(3L, 4L, 1L, 1L, 5L), V4 = c(5L, 1L, 1L, 3L, 4L
)), .Names = c("V1", "V2", "V3", "V4"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5"))

업데이트 1 원래 게시된 이후로 dplyr이 변경되었습니다.%.%로.%>%따라서 그에 따라 답변을 수정합니다.

이제 업데이트 2 dplyr이case_when다른 솔루션을 제공합니다.

myfile %>% 
       mutate(V5 = case_when(V1 == 1 & V2 != 4 ~ 1, 
                             V2 == 4 & V3 != 1 ~ 2,
                             TRUE ~ 0))

와 함께dplyr 0.7.2당신은 매우 유용한 것을 사용할 수 있습니다.case_when함수:

x=read.table(
 text="V1 V2 V3 V4
 1  1  2  3  5
 2  2  4  4  1
 3  1  4  1  1
 4  4  5  1  3
 5  5  5  5  4")
x$V5 = case_when(x$V1==1 & x$V2!=4 ~ 1,
                 x$V2==4 & x$V3!=1 ~ 2,
                 TRUE ~ 0)

으로 표현됨dplyr::mutate다음을 제공합니다.

x = x %>% mutate(
     V5 = case_when(
         V1==1 & V2!=4 ~ 1,
         V2==4 & V3!=1 ~ 2,
         TRUE ~ 0
     )
)

참고로NA오해의 소지가 있으므로 특별히 취급하지 않습니다.함수가 반환됩니다.NA조건이 일치하지 않는 경우에만.에 선을 긋는다면,TRUE ~ ...내가 예에서 했던 것처럼, 그 반환 값은 절대로 다음과 같을 수 없습니다.NA.

그러므로, 당신은 표현적으로 말해야 합니다.case_when말하자면NA다음과 같은 진술을 추가함으로써 그것이 속한 곳.is.na(x$V1) | is.na(x$V3) ~ NA_integer_힌트: 더dplyr::coalesce()기능은 때때로 여기서 정말 유용할 수 있습니다!

또한, 주의하시기 바랍니다.NA혼자서는 보통 작동하지 않을 것입니다, 당신은 특별하게 해야 합니다.NA값:NA_integer_,NA_character_또는NA_real_.

처럼 보입니다.derivedFactor에서mosaic패키지는 이를 위해 설계되었습니다.이 예에서는 다음과 같이 나타납니다.

library(mosaic)
myfile <- mutate(myfile, V5 = derivedFactor(
    "1" = (V1==1 & V2!=4),
    "2" = (V2==4 & V3!=1),
    .method = "first",
    .default = 0
    ))

(결과를 요인 대신 숫자로 표시하려면 다음과 같이 입력합니다.derivedFactor와 함께as.numeric.)

참고:.default와 결합된 옵션.method = "first""경고" 조건을 설정합니다. 이 접근 방식은 다음에 대한 도움말 파일에 설명되어 있습니다.derivedFactor.

언급URL : https://stackoverflow.com/questions/22337394/dplyr-mutate-with-conditional-values

반응형