source

데이터 프레임에서 문자 값을 NA로 바꾸기

factcode 2023. 10. 21. 10:53
반응형

데이터 프레임에서 문자 값을 NA로 바꾸기

문자 값(예: 임의의 장소에서)을 포함하는 데이터 프레임이 있습니다."foo")으로 대체하고 싶은 것은NA.

전체 데이터 프레임에서 이를 수행하는 가장 좋은 방법은 무엇입니까?

다음 내용:

df[df == "foo"] <- NA

처음부터 데이터를 읽을 때 해당 문자를 NA로 변환하는 것이 이 문제를 해결하는 한 가지 방법입니다.

df <- read.csv("file.csv", na.strings = c("foo", "bar"))

사용.dplyr::na_if, 특정 값을 대체할 수 있습니다.NA. 이 경우에는, 그것은"foo".

library(dplyr)
set.seed(1234)

df <- data.frame(
  id = 1:6,
  x = sample(c("a", "b", "foo"), 6, replace = T),
  y = sample(c("c", "d", "foo"), 6, replace = T),
  z = sample(c("e", "f", "foo"), 6, replace = T),
  stringsAsFactors = F
)
df
#>   id   x   y   z
#> 1  1   a   c   e
#> 2  2   b   c foo
#> 3  3   b   d   e
#> 4  4   b   d foo
#> 5  5 foo foo   e
#> 6  6   b   d   e

na_if(df$x, "foo")
#> [1] "a" "b" "b" "b" NA  "b"

여러 열에 대해 이 작업을 수행해야 할 경우 다음을 통과할 수 있습니다."foo"…을 통하여mutate와 함께across(updated 대상dplyrv1.0.0+).

df %>%
  mutate(across(c(x, y, z), na_if, "foo"))
#>   id    x    y    z
#> 1  1    a    c    e
#> 2  2    b    c <NA>
#> 3  3    b    d    e
#> 4  4    b    d <NA>
#> 5  5 <NA> <NA>    e
#> 6  6    b    d    e

또 다른 옵션은is.na<-:

is.na(df) <- df == "foo"

사용법이 약간 직관에 어긋날 수도 있지만 실제로는 다음을 할당합니다. NA에의 가치.df오른쪽에 있는 색인을 찾습니다.

이 일은 다음과 같이 할 수 있습니다.dplyr::mutate_all()그리고.replace:

library(dplyr)
df <- data_frame(a = c('foo', 2, 3), b = c(1, 'foo', 3), c = c(1,2,'foobar'),  d = c(1, 2, 3))

> df
# A tibble: 3 x 4
     a     b      c     d
  <chr> <chr>  <chr> <dbl>
1   foo     1      1     1
2     2   foo      2     2
3     3     3 foobar     3


df <- mutate_all(df, funs(replace(., .=='foo', NA)))

> df
# A tibble: 3 x 4
      a     b      c     d
  <chr> <chr>  <chr> <dbl>
1  <NA>     1      1     1
2     2  <NA>      2     2
3     3     3 foobar     3

다른dplyr옵션은 다음과 같습니다.

df <- na_if(df, 'foo') 

열 이름을 모르거나 선택할 열 수가 많다고 가정하면,is.character()쓸모가 있을지도 모릅니다.

df <- data.frame(
  id = 1:6,
  x = sample(c("a", "b", "foo"), 6, replace = T),
  y = sample(c("c", "d", "foo"), 6, replace = T),
  z = sample(c("e", "f", "foo"), 6, replace = T),
  stringsAsFactors = F
)
df
#   id   x   y   z
# 1  1   b   d   e
# 2  2   a foo foo
# 3  3   a   d foo
# 4  4   b foo foo
# 5  5 foo foo   e
# 6  6 foo foo   f

df %>% 
  mutate_if(is.character, list(~na_if(., "foo")))
#   id    x    y    z
# 1  1    b    d    e
# 2  2    a <NA> <NA>
# 3  3    a    d <NA>
# 4  4    b <NA> <NA>
# 5  5 <NA> <NA>    e
# 6  6 <NA> <NA>    f

한 가지 해결 방법은 다음과 같습니다.

for (i in 1:ncol(DF)){
  DF[which(DF[,i]==""),columnIndex]<-"ALL"
  FinalData[which(is.na(FinalData[,columnIndex])),columnIndex]<-"ALL"
}

언급URL : https://stackoverflow.com/questions/3357743/replacing-character-values-with-na-in-a-data-frame

반응형