데이터 프레임의 모든 특정 값 바꾸기
데이터 프레임을 사용할 경우 모든 행과 열을 따라 특정 값을 모두 교체하려면 어떻게 해야 합니까?예를 들어 모든 빈 레코드를 다음과 같이 바꾸겠다고 합니다.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
'programing' 카테고리의 다른 글
Amazon S3 및 CORS(Cross-Origin Resource Sharing) (0) | 2023.09.25 |
---|---|
자바 langNoSuchMethodException: userAuth.사용자.() (0) | 2023.09.25 |
MVC4 - 최적화가 true로 설정된 경우 번들링이 작동하지 않습니다. (0) | 2023.09.25 |
다른 열을 기준으로 열을 변환하는 파워 쿼리 (0) | 2023.09.25 |
Jquery/PHP를 이용한 채팅방 구현 방법은? (0) | 2023.09.25 |