2016-11-17 84 views
1

最常見的元件可以說我有3個因素,每個都具有2級:「A」和「b」:採摘從許多因素

> b <- factor(c('b', 'b', 'a')) 
> a <- factor(c('a', 'b', 'a')) 
> c <- factor(c('a', 'a', 'a')) 

我想創建第四因子上的每個位置包含這3個因素中最常見的元素,所以,在這個例子中,它應該是這樣的:

> d 
[1] a b a 
Levels: a b 

有一些「平滑」功能執行這種操作的一種方式,還是我使用「if」條件?

+0

你能保證每個因素有相同的水平?你這樣說,但你的''c'變量只有''a'',並且你沒有指定'levels = c(「a」,「b」)'。 – Gregor

+0

是的,對不起,我沒有注意到。每個因素具有相同的水平。 –

+0

另外,您是否需要一個可以推廣到2個以上級別的解決方案?並且重新排列關卡的級別會好嗎? – Gregor

回答

2

我們可以嘗試

factor(apply(data.frame(b, a, c), 1, Mode), levels = levels(a)) 
#[1] a b a 
#Levels: a b 

其中Mode

Mode <- function(x) { 
ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 
+1

作品 - 非常感謝。 –

1

這應該這樣做。你不應該命名c,因爲它表示連接函數。

bb <- factor(c('b', 'b', 'a')) 
aa <- factor(c('a', 'b', 'a')) 
cc <- factor(c('a', 'a', 'a')) 

dat <- data.frame(aa, bb, cc) 

dd <- factor(apply(dat, 1, function(x) names(sort(table(x), decreasing = TRUE))[1])) 

dd 

[1] a b a 
Levels: a b 

> dat 
    aa bb cc 
1 a b a 
2 b b a 
3 a a a 
+0

我知道,這僅僅是爲了舉例的目的 - 仍然是我的錯誤,謝謝指出。 –