Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting multiple boolean columns to single factor column

my data frame look like this:

      A S1 S2 S3 S4
1   ex1  1  0  0  0
2   ex2  0  1  0  0
3   ex3  0  0  1  0
4   ex4  1  0  0  0
5   ex5  0  0  0  1
6   ex6  0  1  0  0
7   ex7  1  0  0  0
8   ex8  0  1  0  0
9   ex9  0  0  1  0
10 ex10  1  0  0  0

i need to have it as a single factor list like:

A   Type
ex1 S1
ex2 S2
ex3 S3
ex4 S1
ex5 S4
ex6 S2
ex7 S1
ex8 S2
ex9 S3
ex10 S1

anybody help my problem?

like image 259
Samsudhin Avatar asked Sep 04 '25 01:09

Samsudhin


2 Answers

Assuming d is the data, the new column could be obtained with

d$type <- names(d[-1])[apply(d[-1] == 1, 1, which)]
d[c(1, 6)]
#       A type
# 1   ex1   S1
# 2   ex2   S2
# 3   ex3   S3
# 4   ex4   S1
# 5   ex5   S4
# 6   ex6   S2
# 7   ex7   S1
# 8   ex8   S2
# 9   ex9   S3
# 10 ex10   S1
like image 119
Rich Scriven Avatar answered Sep 07 '25 05:09

Rich Scriven


You can use apply and check the max in the columns 2-5 and then return the corresponding column name:

df$Type <- apply(df[2:5], 1, function(x) names(df)[which.max(x)+1] )

Afterwards, you can delete the columns you don't need anymore:

df <- df[,-c(2:5)]
like image 26
talat Avatar answered Sep 07 '25 06:09

talat