2017-08-22 1 views
3

データフレームがあります。データフレームの要素をバイナリデータに変換する

zz <- "col1 col2 col3 
1   A   B   C 
2   A   B   C 
3   A   B   A 
4   A   C   A 
5   B   B   A 
6   B   B   A" 

Data <- read.table(text=zz, header = TRUE) 

各列には2つの値しかありません。私は最も頻繁な値を0に変換し、最も低い値を1に変換したいと思います。 [[<-.data.frame*tmp*、I、値= Cで

エラー:私はこの試みた

zz <- "col1 col2 col3 
1   1   1   0 
2   1   1   0 
3   1   1   1 
4   1   0   1 
5   0   1   1 
6   0   1   1" 

:私はこのようなすべての列にこれを適用したい

for (i in 1:3){ 
    Data[[i]][[names(sort(summary(as.factor(Data[[i]])),decreasing=TRUE)[1])]] <- 0 
    Data[[i]][[names(sort(summary(as.factor(Data[[i]])),decreasing=TRUE)[2])]] <- 1 
} 

をしかし得ます(2L、2L、2L、2L、2L、2L、: の置換は12行あり、データは11デフプラスです:警告メッセージ: [[<-.factor*tmp*) RY(as.factor(df.matrix_binary [[I]]))、: 無効な因子レベルは、NAが

答えて

3

を生成あなたは試みることができる:あなたがポストされたデータに基づいて

Data[] <- lapply(Data, function(x) as.numeric(x == names(sort(table(x)))[2])) 

Data 
    col1 col2 col3 
1 1 1 0 
2 1 1 0 
3 1 1 1 
4 1 0 1 
5 0 1 1 
6 0 1 1 

注意を私はあなたが2つ以上の値を持っている場合、これはすべてのエラー処理を行わないように、あなたは各列に2つの値を持つと仮定していました。ただし、列に2つ以上の値がある場合は、これを簡単に変更できます。ここで

+0

を持つ一つの選択肢は親切 'ソート(表(x))をに変更され、[ - 1]' – Wen

+0

@Wen、私は場合には、予期しない結果を生む心配OPの列に2以上の値があります。私。 3つの値がある場合、 '[-1]'は2つを選択し、 '=='は比較の2つの値をリサイクルします。 'Data [、3] == names(sort(table(Data [、3])))'を試してください。恐らくエラーを投げるのが最善でしょう –

0
sapply(Data, function(x) as.numeric(x == levels(x)[order(-tabulate(x))][1])) 
#  col1 col2 col3 
#[1,] 1 1 0 
#[2,] 1 1 0 
#[3,] 1 1 1 
#[4,] 1 0 1 
#[5,] 0 1 1 
#[6,] 0 1 1 
1

tidyverse

library(dplyr) 
library(forcats) 
Data %>% 
    mutate_all(funs(match(., fct_count(., sort = TRUE)$f[1], nomatch = 0))) 
#  col1 col2 col3 
#1 1 1 0 
#2 1 1 0 
#3 1 1 1 
#4 1 0 1 
#5 0 1 1 
#6 0 1 1 
関連する問題