2016-11-17 67 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

我知道,这仅仅是为了举例的目的 - 仍然是我的错误,谢谢指出。 –