データフレーム内のすべての特定の値を置き換えます


88

データフレームがあるので、すべての行と列に沿ってすべての特定の値を置き換えるにはどうすればよいですか。たとえば、すべての空のレコードを次のように置き換えたいとします。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

回答:


138

このような:

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

14
複数の値に対してこれを効率的に行う方法はありますか?
PikkuKatja 2015年

28
これはファクターでdf[df=="xyz"]<-"abc"は機能せず、「無効なファクターレベル」でエラーが発生します。より一般的な解決策はありますか?
glallen 2015

1
私のために働いていません。私はこれを試しました:dfSmallDiscreteCustomSalary [dfSmallDiscreteCustomSalary $ salary == "<= 50K"] <-"49K"。それでもunique(dfSmallDiscreteCustomSalary $ salary)の場合:[1]> 50K <= 50K
Codious-JR 2015

3
glallen ...すでに因子である新しい値で因子列を変更しようとしている場合は、おそらく私が提案しようとしているよりも賢い方法がありますが、df $ factorcolumn <-as.character( df $ factorcolumn)、次に変更を加え、それを再び因子に戻すことで終了します... df $ factorcolumn <-as.factor(df $ factorcolumn); それはあなたの新しいレベルと望ましい価値で完成するでしょう。
Joshua Eric Turcotte 2017年

見つけた:df.na.replace(df.columns、Map( ""-> "NA"))。show。興味深いことに、値としてnullに置き換えることはできません。次のようになります:java.lang.IllegalArgumentException:サポートされていない値型java.lang.String(null)。org.apache.spark.sql.DataFrameNaFunctions.org $ apache $ spark $ sql $ DataFrameNaFunctions $$ convertToDouble(DataFrameNaFunctions.scala:434)
sriram 2017年

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に置き換えるにはどうすればよいですか?
ティーツリー

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
このユースケースに外部ライブラリを使用するのはなぜですか?これが1行で解決できるのに、なぜループなのですか?あなたの答えは、すでに存在する答えを超えてどのように価値を付加しますか?厳しくするつもりはありません。何かが足りないと思うので、質問があります。
sedot 2017年

2
大規模なデータセットの場合ははるかに高速です。ユーザーが自分に最適なものを選択できるように、代替手段を追加します。
skan 2017年

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.