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


88

데이터 프레임이있는 경우 모든 행과 열을 따라 모든 특정 값을 대체하는 방법은 무엇입니까? 예를 들어 모든 빈 레코드를 NA's (위치를 입력하지 않고) 로 바꾸고 싶습니다 .

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

답변:


138

이렇게 :

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

14
둘 이상의 값에 대해이 작업을 효율적으로 수행하는 방법이 있습니까?
PikkuKatja

28
요인에 대해서는 작동하지 않으며 df[df=="xyz"]<-"abc""유효하지 않은 요인 수준"오류가 발생합니다. 더 일반적인 해결책이 있습니까?
glallen 2015 년

1
나를 위해 일하지 않습니다. 나는 이것을 시도했다 : dfSmallDiscreteCustomSalary [dfSmallDiscreteCustomSalary $ salary == "<= 50K"] <- "49K". 여전히 unique (dfSmallDiscreteCustomSalary $ salary)에 대해 다음을 얻습니다. [1]> 50K <= 50K
Codious-JR

3
glallen ... 이미 요인 인 새 값으로 요인 열을 수정하려는 경우 제가 제안하려는 더 영리한 방법이있을 수 있지만 df $ factorcolumn <-as.character ( df $ factorcolumn), 그런 다음 수정하고 다시 요인으로 전환하여 완료합니다 ... df $ factorcolumn <-as.factor (df $ factorcolumn); 새로운 레벨과 원하는 가치로 완성 될 것입니다.
Joshua Eric Turcotte 17 년

찾았습니다 : df.na.replace (df.columns, Map ( ""-> "NA")). show. 흥미롭게도 값으로 null로 바꿀 수 없습니다. 나는 얻고있다 : java.lang.IllegalArgumentException : 지원되지 않는 값 유형 java.lang.String (null). at org.apache.spark.sql.DataFrameNaFunctions.org $ apache $ spark $ sql $ DataFrameNaFunctions $$ convertToDouble (DataFrameNaFunctions.scala : 434)
sriram

34

PikkuKatja와 glallen이 좀 더 일반적인 해결책을 요청했기 때문에 아직 언급 할 수 없으므로 답변을 작성하겠습니다. 다음과 같이 문을 결합 할 수 있습니다.

> 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)

18

다음은 몇 가지 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'))

모든 열 솔루션을 사용하여 전체 데이터 세트에서 여러 문자열을 NA로 대체하는 방법은 무엇입니까?
Tea Tree

4

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)

다시 data.frame으로 변환 할 수 있습니다.

setDF(df)

data.frame 만 사용하고 더 어려운 요인을 유지하려면 다음 작업을 수행해야합니다.

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

여기서 value는 모든 열의 이름입니다. 루프에 삽입해야합니다.


2
이 사용 사례에 외부 라이브러리를 사용하는 이유는 무엇입니까? 한 줄로 해결할 수 있다면 왜 루프입니까? 귀하의 답변이 이미 존재하는 답변 이상의 가치를 어떻게 추가합니까? 나는 가혹할 생각이 없습니다. 나는 무언가를 놓치고 있다고 생각합니다.
sedot

2
대규모 데이터 세트의 경우 훨씬 빠릅니다. 사용자가 자신에게 가장 적합한 것을 선택할 수 있도록 대안을 추가합니다.
skan

0

데이터 프레임에서 여러 값을 바꾸려면 모든 열을 반복하는 것이 도움이 될 수 있습니다.

교체 ""하고 싶다고 가정 하고 100:

na_codes <- c(100, "")
for (i in seq_along(df)) {
    df[[i]][df[[i]] %in% na_codes] <- NA
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.