programing

데이터 프레임의 모든 특정 값 바꾸기

topblog 2023. 9. 25. 22:10
반응형

데이터 프레임의 모든 특정 값 바꾸기

데이터 프레임을 사용할 경우 모든 행과 열을 따라 특정 값을 모두 교체하려면 어떻게 해야 합니까?예를 들어 모든 빈 레코드를 다음과 같이 바꾸겠다고 합니다.NA의 (위치를 입력하지 않음):

df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100)))

    A   B
1      12
2  xyz    
3  jkl 100

예상 결과:

    A   B
1  NA   12
2  xyz  NA  
3  jkl  100

다음과 같은 경우:

> df[df==""]<-NA
> df
     A    B
1 <NA>   12
2  xyz <NA>
3  jkl  100

Pikku Katja와 gallen이 좀 더 일반적인 해결책을 요청해서 아직 코멘트를 할 수 없으니 답변을 작성하겠습니다.문은 다음과 같이 결합할 수 있습니다.

> df[df=="" | df==12] <- NA
> df
     A    B
1  <NA> <NA>
2  xyz  <NA>
3  jkl  100

인자의 경우 zxzak의 코드는 이미 인자를 산출합니다.

> df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)))
> str(df)
'data.frame':   3 obs. of  2 variables:
 $ A: Factor w/ 3 levels "","jkl","xyz": 1 3 2
 $ B: Factor w/ 3 levels "","100","12": 3 1 2

만약 문제가 있다면, 저는 그 요소들을 일시적으로 삭제하는 것을 제안합니다.

df[] <- lapply(df, as.character)

여기 몇명이 있습니다.dplyr옵션:

library(dplyr)

# all columns:
df %>% 
  mutate_all(~na_if(., ''))

# specific column types:
df %>% 
  mutate_if(is.factor, ~na_if(., ''))

# specific columns:  
df %>% 
  mutate_at(vars(A, B), ~na_if(., ''))

# or:
df %>% 
  mutate(A = replace(A, A == '', NA))

# replace can be used if you want something other than NA:
df %>% 
  mutate(A = as.character(A)) %>% 
  mutate(A = replace(A, A == '', 'used to be empty'))

data.table을 사용하면 빠르게 얻을 수 있습니다.요인이 없는 df를 먼저 만들고,

df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F)

이제 사용할 수 있습니다.

setDT(df)
for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA)

데이터 프레임으로 다시 변환할 수 있습니다.

setDF(df)

data.frame만 사용하고 요인을 유지하는 것이 더 어렵다면 작업해야 합니다.

levels(df$value)[levels(df$value)==""] <- NA

여기서 value는 모든 열의 이름입니다.고리로 끼워야 합니다.

데이터 프레임에서 여러 값을 교체하려는 경우 모든 열을 순환하는 것이 도움이 될 수 있습니다.

바꾸기를 원한다고 말합니다.""그리고.100:

na_codes <- c(100, "")
for (i in seq_along(df)) {
    df[[i]][df[[i]] %in% na_codes] <- NA
}

여러 개의 값을 교체하고 인자에 대한 해가 누락된 것으로 보여 하나를 추가하겠습니다.

데이터 프레임을 고려합니다.dat각양각색의

dat
#    character integer       Date factor               POSIX
# 1                  4 2022-07-10      B 2022-07-10 20:08:10
# 2                  1 2022-07-11    FOO 2022-07-10 21:08:10
# 3                 -2 2022-07-12        2022-07-10 22:08:10
# 4                  2 2022-07-13      B 2022-07-10 23:08:10
# 5          a       3 2022-07-14        2022-07-11 00:08:10
# 6          c       1 2022-07-15        2022-07-11 01:08:10
# 7          a      -1 2022-07-16    FOO 2022-07-11 02:08:10
# 8          a      -1 2022-07-17      A 2022-07-11 03:08:10
# 9                  4 2022-07-18    FOO 2022-07-11 04:08:10
# 10         c       0 2022-07-19    FOO 2022-07-11 05:08:10
# 11         b      -2 2022-07-20      B 2022-07-11 06:08:10
# 12         c      -2 2022-07-21      A 2022-07-11 07:08:10

NA로 변환하고 싶은 모든 것을 리스트에 올릴 수 있습니다.to_na,

To_NA <- list('', -1, -2, 'c', 'FOO', as.Date('2022-07-17'), as.POSIXct('2022-07-11 00:08:10'))

그리고 작은 기능으로 사용합니다.make_na에 기반을 둔replace.if각각의 변수is.factor우리는 원할지도 모릅니다.droplevels삭제된 지 얼마 안 된 값의.

make_na <- \(x, z) {x <- replace(x, x %in% z, NA); if (is.factor(x)) droplevels(x) else x}

벡터에 적용할 수 있습니다

make_na(dat$character, To_NA)
# [1] NA  NA  NA  NA  "a" NA  "a" "a" NA  NA  "b" NA 

또는 열 위로 루프를 사용합니다.lapply.

dat[] <- lapply(dat, make_na, To_NA)

주는 것

dat
#    character integer       Date factor               POSIX
# 1       <NA>       4 2022-07-10      B 2022-07-10 20:08:10
# 2       <NA>       1 2022-07-11   <NA> 2022-07-10 21:08:10
# 3       <NA>      NA 2022-07-12   <NA> 2022-07-10 22:08:10
# 4       <NA>       2 2022-07-13      B 2022-07-10 23:08:10
# 5          a       3 2022-07-14   <NA>                <NA>
# 6       <NA>       1 2022-07-15   <NA> 2022-07-11 01:08:10
# 7          a      NA 2022-07-16   <NA> 2022-07-11 02:08:10
# 8          a      NA       <NA>      A 2022-07-11 03:08:10
# 9       <NA>       4 2022-07-18   <NA> 2022-07-11 04:08:10
# 10      <NA>       0 2022-07-19   <NA> 2022-07-11 05:08:10
# 11         b      NA 2022-07-20      B 2022-07-11 06:08:10
# 12      <NA>      NA 2022-07-21      A 2022-07-11 07:08:10

위치:

str(dat)
# 'data.frame': 12 obs. of  5 variables:
#  $ character: chr  NA NA NA NA ...
#  $ integer  : int  4 1 NA 2 3 1 NA NA 4 0 ...
#  $ Date     : Date, format: "2022-07-10" "2022-07-11" "2022-07-12" ...
#  $ factor   : Factor w/ 2 levels "A","B": 2 NA NA 2 NA NA NA 1 NA NA ...
#  $ POSIX    : POSIXct, format: "2022-07-10 20:08:10" "2022-07-10 21:08:10" "2022-07-10 22:08:10" ...

데이터:

dat <- structure(list(character = c("", "", "", "", "a", "c", "a", "a", 
"", "c", "b", "c"), integer = c(4L, 1L, -2L, 2L, 3L, 1L, -1L, 
-1L, 4L, 0L, -2L, -2L), Date = structure(c(19183, 19184, 19185, 
19186, 19187, 19188, 19189, 19190, 19191, 19192, 19193, 19194
), class = "Date"), factor = structure(c(3L, 4L, 1L, 3L, 1L, 
1L, 4L, 2L, 4L, 4L, 3L, 2L), levels = c("", "A", "B", "FOO"), class = "factor"), 
    POSIX = structure(c(1657476490L, 1657480090L, 1657483690L, 
    1657487290L, 1657490890L, 1657494490L, 1657498090L, 1657501690L, 
    1657505290L, 1657508890L, 1657512490L, 1657516090L), class = c("POSIXct", 
    "POSIXt"), tzone = "")), class = "data.frame", row.names = c(NA, 
-12L))

다른 옵션은 다음을 사용하는 것입니다.replace_with_na_all()로부터naniar패키지 - 전체 데이터 프레임에서 조건을 충족하는 모든 값을 교체할 수 있습니다.

library(naniar)
library(dplyr)
    
df %>% 
  replace_with_na_all(condition = ~.x == "")

산출량

  A     B    
  <chr> <chr>
1 NA    12   
2 xyz   NA   
3 jkl   100 

이 방법의 장점은 만약 공간이 포함된 일부 셀이 있다면 조건 논쟁에서 둘 다를 제공할 수 있다는 것입니다.먼저 공간을 축소하는 것이 낫겠지만 위의 기능을 사용합니다(즉, 추가).mutate(across(everything(), ~ trimws(.x)))파이프에 연결합니다.

df <- data.frame(list(A=c("", "xyz", "  "), B=c(12, "   ", 100)))

df %>%
  replace_with_na_all(condition = ~.x %in% c("", "  ", "   "))

#  A     B    
#  <chr> <chr>
#1 NA    12   
#2 xyz   NA   
#3 NA    100  

다른 옵션은 다음을 사용할 수 있습니다.sapply. 다음은 재현 가능한 예입니다.

df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100)))
df[sapply(df, \(x) x == "")] <- NA
df
#>      A    B
#> 1 <NA>   12
#> 2  xyz <NA>
#> 3  jkl  100

2023-01-15에 repex v2.0.2를 사용하여 생성됨


참고: R 4.1.0 이상에서는 다음과 같이 사용할 수 있습니다.\(x)대신에function(x)

언급URL : https://stackoverflow.com/questions/19503266/replace-all-particular-values-in-a-data-frame

반응형