Converting multiple boolean columns to single factor column

守給你的承諾、 提交于 2020-01-09 11:51:57

问题


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?


回答1:


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



回答2:


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)]



回答3:


Could also do (if dat is your data set)

library(reshape2)
dat <- melt(dat, id = "A")
dat[dat$value > 0, 1:2]



回答4:


You could try: If df is the dataframe

data.frame(A=df$A, Type=rep(names(df)[-1], nrow(df))[!!t(df[,-1])])
    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

Also:

   names(df)[-1][t(df[-1])*seq_len(ncol(df)-1)]
 [1] "S1" "S2" "S3" "S1" "S4" "S2" "S1" "S2" "S3" "S1"


来源:https://stackoverflow.com/questions/24361120/converting-multiple-boolean-columns-to-single-factor-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!