ここに私のデータフレームdfがあります
私はしようとしています:
df=data.frame(rbind(c(1,"*","*"),c("*",3,"*"))
df2=as.data.frame(sapply(df,sub,pattern="*",replacement="NA"))
アスタリスクのために機能しませんが、それを置き換えようとして怒っています。
ここに私のデータフレームdfがあります
私はしようとしています:
df=data.frame(rbind(c(1,"*","*"),c("*",3,"*"))
df2=as.data.frame(sapply(df,sub,pattern="*",replacement="NA"))
アスタリスクのために機能しませんが、それを置き換えようとして怒っています。
あなたが持っているだけの場合*
(つまり、のようではないab*de
)data.frame
、あなたはなしでこれを行うことができますregex
:
df[df == "*"] <- NA
ここでの両方のソリューションは、すでに職場にあるオブジェクトに対応しています。可能であれば (または少なくとも将来)、 でna.strings
引数を使用できますread.table
。これは複数の「文字列」であるため、値として扱う文字を複数指定できるはずNA
です。
次に例を示します。これは、「readmein.txt」という名前のファイルを現在の作業ディレクトリに書き込み、そこにあることを確認するだけです。
cat("V1 V2 V3 V4 V5 V6 V7\n
2 * * * * * 2\n
1 2 * * * * 1\n", file = "readmein.txt")
list.files(pattern = "readme")
# [1] "readmein.txt"
read.table
これが実際の議論na.strings
です。
read.table("readmein.txt", na.strings="*", header = TRUE)
# V1 V2 V3 V4 V5 V6 V7
# 1 2 NA NA NA NA NA 2
# 2 1 2 NA NA NA NA 1
他の2つの答えには別の問題があります。列が数値である可能性がある場合でも、どちらも文字(またはむしろ因子)変数になります。
これが例です。まず、サンプル データセットを作成します。楽しみのために、NA
「.」として扱われる別の文字を追加しました。
temp <- data.frame(
V1 = c(1:3),
V2 = c(1, "*", 3),
V3 = c("a", "*", "c"),
V4 = c(".", "*", "3"))
temp
# V1 V2 V3 V4
# 1 1 1 a .
# 2 2 * * *
# 3 3 3 c 3
str(temp)
# 'data.frame': 3 obs. of 4 variables:
# $ V1: int 1 2 3
# $ V2: Factor w/ 3 levels "*","1","3": 2 1 3
# $ V3: Factor w/ 3 levels "*","a","c": 2 1 3
# $ V4: Factor w/ 3 levels ".","*","3": 1 2 3
コピーを作成して、最も明白な「R」の方法と考えられる方法でこれを解決しましょう。
temp1 <- temp
temp1[temp1 == "*"|temp1 == "."] <- NA
大丈夫そうです...
temp1
# V1 V2 V3 V4
# 1 1 1 a <NA>
# 2 2 <NA> <NA> <NA>
# 3 3 3 c 3
...しかし、V2 と V4 は数値であるべきだと思います....
str(temp1)
# 'data.frame': 3 obs. of 4 variables:
# $ V1: int 1 2 3
# $ V2: Factor w/ 3 levels "*","1","3": 2 NA 3
# $ V3: Factor w/ 3 levels "*","a","c": 2 NA 3
# $ V4: Factor w/ 3 levels ".","*","3": 1 NA 3
回避策は次のとおりです。
temp2 <- read.table(text = capture.output(temp), na.strings = c("*", "."))
temp2
# V1 V2 V3 V4
# 1 1 1 a NA
# 2 2 NA <NA> NA
# 3 3 3 c 3
str(temp2)
# 'data.frame': 3 obs. of 4 variables:
# $ V1: int 1 2 3
# $ V2: int 1 NA 3
# $ V3: Factor w/ 2 levels "a","c": 1 NA 2
# $ V4: int NA NA 3
ヘルプ ページtype.convert
で「 のヘルパー関数」として説明されているを使用する方が適切な場合があります。read.table
時間は測っていませんが、上記の回避策よりも高速で、すべての利点があると思います。
data.frame(
lapply(temp, function(x) type.convert(
as.character(x), na.strings = c("*", "."))))
完全に再現可能な例を提示する必要があります。簡単にすると、人々は助けてくれる傾向があります。誰でも...
dat <- data.frame(a=c(1,2,'*',3,4), b=c('*',2,3,4,'*'))
> dat
a b
1 1 *
2 2 2
3 * 3
4 3 4
5 4 *
> as.data.frame(sapply(dat,sub,pattern='\\*',replacement=NA))
a b
1 1 <NA>
2 2 2
3 <NA> 3
4 3 4
5 4 <NA>
これは機能する可能性があります (かなり柔軟です) が、他にも優れたソリューションが既にあります。Arun のソリューションは私の典型的なアプローチですがreplacer
、新しい R (コマンド ラインの経験がほとんどない) ユーザー向けに作成されています。replacer
少しでも経験がある人にはお勧めしません。
library(qdap)
replacer(dat, "*", NA)