2015-05-26 41 views
2

是否有函數將多個列值摺疊爲1個因子? 對於第2列4列,每條記錄都只有1個TRUE值。 記錄的結果值應該是具有真值的列名。colapse multiple columns values into 1 factor

輸入數據幀:

data <- data.frame(user=c(1,2,3,4), blue=c(T,F,T,F), green=c(F,F,F,T), red=c(F,T,F,F)) 

    user blue green red 
1 1 TRUE FALSE FALSE 
2 2 FALSE FALSE TRUE 
3 3 TRUE FALSE FALSE 
4 4 FALSE TRUE FALSE 

預期輸出:

user color 
1 1 blue 
2 2 red 
3 3 blue 
4 4 green 

回答

3
cbind(data[1], color = apply(data[-1], 1, function(x) names(data[-1])[x])) 
    user color 
1 1 blue 
2 2 red 
3 3 blue 
4 4 green 
1

你可以試試這個:

data$named.colors <- factor(apply(data[,2:4], 1, function(row) which(row == T)), labels = c("blue", "green", "red")) 

它遍歷每一行,並找到列那是真的,然後把它變成一個因素。

+0

這是我實際使用的一個,我不知道它爲什麼有downvote ... – Enrique

0

下面是一個使用qdapTools包,我保持一個辦法:

library(qdapTools) 
data[["color"]] <- unlist(counts2list(data[-1])) 

## user blue green red color 
## 1 1 TRUE FALSE FALSE blue 
## 2 2 FALSE FALSE TRUE red 
## 3 3 TRUE FALSE FALSE blue 
## 4 4 FALSE TRUE FALSE green 

如果你只想usercolor使用data[c(1, 5)]

2

建議您在tidyr包一看gather功能。

require("tidyr") 
require("dplyr") 
data %>% gather(color, TF, -user) %>% filter(TF == T) %>% select(-TF) %>% arrange(user) 
# user color 
# 1 1 blue 
# 2 2 red 
# 3 3 blue 
# 4 4 green 
相關問題