R には、600,000 個のカテゴリ変数があり、それぞれが「0」、「1」、または「2」に分類されています。
私がやりたいのは、「1」と「2」を折りたたんで「0」をそのままにして、「0」=「0」を再分類した後です。"1" = "1" および "2" = "1"。最終的に、各変数のカテゴリとして「0」と「1」のみが必要です。
また、可能であれば、既存の変数を新しい値に置き換えることができれば、600,000 個の新しい変数を作成したくありません。
これを行う最良の方法は何ですか?
R には、600,000 個のカテゴリ変数があり、それぞれが「0」、「1」、または「2」に分類されています。
私がやりたいのは、「1」と「2」を折りたたんで「0」をそのままにして、「0」=「0」を再分類した後です。"1" = "1" および "2" = "1"。最終的に、各変数のカテゴリとして「0」と「1」のみが必要です。
また、可能であれば、既存の変数を新しい値に置き換えることができれば、600,000 個の新しい変数を作成したくありません。
これを行う最良の方法は何ですか?
を使用すると、これはさらに一般的であることがわかりますfactor(new.levels[x])
。
> x <- factor(sample(c("0","1","2"), 10, replace=TRUE))
> x
[1] 0 2 2 2 1 2 2 0 2 1
Levels: 0 1 2
> new.levels<-c(0,1,1)
> x <- factor(new.levels[x])
> x
[1] 0 1 1 1 1 1 1 0 1 1
Levels: 0 1
新しいレベル ベクトルは、x のレベル数と同じ長さでなければならないため、たとえば文字列や NA を使用して、より複雑な再コード化を行うことができます。
x <- factor(c("old", "new", NA)[x])
> x
[1] old <NA> <NA> <NA> new <NA> <NA> old
[9] <NA> new
Levels: new old
recode() はちょっとやり過ぎです。あなたのケースは、現在のコーディング方法によって異なります。変数が x だとしましょう。
数値だと
x <- ifelse(x>1, 1, x)
キャラだと
x <- ifelse(x=='2', '1', x)
レベル 0,1,2 の因子の場合
levels(x) <- c(0,1,1)
これらのいずれも、データ フレーム dta 全体で変数 x に適用できます。例えば...
dta$x <- ifelse(dta$x > 1, 1, dta$x)
または、フレームの複数の列
df[,c('col1','col2'] <- sapply(df[,c('col1','col2'], FUN = function(x) ifelse(x==0, x, 1))
recode
パッケージには関数がありますcar
(Companion to Applied Regression):
require("car")
recode(x, "c('1','2')='1'; else='0'")
またはプレーンRの場合:
> x <- factor(sample(c("0","1","2"), 10, replace=TRUE))
> x
[1] 1 1 1 0 1 0 2 0 1 0
Levels: 0 1 2
> factor(pmin(as.numeric(x), 2), labels=c("0","1"))
[1] 1 1 1 0 1 0 1 0 1 0
Levels: 0 1
更新:データフレームのすべてのカテゴリ列を再コード化tmp
するには、次を使用できます
recode_fun <- function(x) factor(pmin(as.numeric(x), 2), labels=c("0","1"))
require("plyr")
catcolwise(recode_fun)(tmp)
値をすばやく再コード化できる dplyr の関数が気に入りました。
library(dplyr)
df$x <- recode(df$x, old = "new")
お役に立てれば :)
完全なデータ フレームを一度に再コード化できるsjmiscrec
パッケージの関数を使用できます(すべての変数に少なくとも同じ再コード値がある場合)。
library(sjmisc)
mydf <- data.frame(a = sample(0:2, 10, T),
b = sample(0:2, 10, T),
c = sample(0:2, 10, T))
> mydf
a b c
1 1 1 0
2 1 0 1
3 0 2 0
4 0 1 0
5 1 0 0
6 2 1 1
7 0 1 1
8 2 1 2
9 1 1 2
10 2 0 1
mydf <- rec(mydf, "0=0; 1,2=1")
a b c
1 1 1 0
2 1 0 1
3 0 1 0
4 0 1 0
5 1 0 0
6 1 1 1
7 0 1 1
8 1 1 1
9 1 1 1
10 1 0 1
結果を 0 ~ 1 のバイナリ変数にしたいだけの場合は、因子を完全に無視できることに注意してください。
f <- sapply(your.data.frame, is.factor)
your.data.frame[f] <- lapply(your.data.frame[f], function(x) x != "0")
2 行目は、次のように、より簡潔に (ただし、より不可解に) 書くこともできます。
your.data.frame[f] <- lapply(your.data.frame[f], `!=`, "0")
これにより、因子が一連の論理変数に変換され、「0」が にマッピングされFALSE
、それ以外は にマッピングされTRUE
ます。FALSE
そしてTRUE
、ほとんどのコードで 0 と 1 として扱われます。これにより、レベル "0" と "1" の因子を使用した場合と本質的に同じ結果が分析で得られるはずです。実際、同じ結果が得られない場合、分析の正確性に疑問が投げかけられます....