如何从R中的数据框中的每一行中选择大多数出现的元素

时间:2016-05-30 14:09:44

标签: r dataframe row

我有一个由40行和16列组成的R数据帧,所有因子。我想创建一个第17列,每行包含最重复的元素(因子)。我在stackexchange上比较了这里解释的方法,但据我所知,这些方法都没有回答我的问题。比方说,我有这个:

    CAT1    CAT2    CAT3   ...  
1   A       B       B
2   B       B       A
3   A       A       A
4   C       C       A
5   B       C       C
...

我想要一个看起来像这样的第四栏:

   COLUMN
1  B
2  B
3  A
4  C
5  C

这应该不难,但我没有看到它。

3 个答案:

答案 0 :(得分:3)

您可以使用table

DF <- read.table(text = "    CAT1    CAT2    CAT3  
                 1   A       B       B
                 2   B       B       A
                 3   A       A       A
                 4   C       C       A
                 5   B       C       C", header = TRUE)

find_most_frequent <- function(x) names(which.max(table(x)))
DF$COLUMN <- apply(DF, 1, find_most_frequent)
#  CAT1 CAT2 CAT3 COLUMN
#1    A    B    B      B
#2    B    B    A      B
#3    A    A    A      A
#4    C    C    A      C
#5    B    C    C      C

如果是tie,则返回排序后首先出现的值。有关字符排序的重要详细信息,请阅读help("Comparison")

答案 1 :(得分:1)

使用table

的另一个想法
df$new <- apply(df, 1, function(i)names(sort(-table(i)))[1])
df
#  CAT1 CAT2 CAT3 new
#1    A    B    B   B
#2    B    B    A   B
#3    A    A    A   A
#4    C    C    A   C
#5    B    C    C   C

答案 2 :(得分:0)

以下是使用tabulate函数的方法:

df$mostCommon <- apply(df, 1, function(i) {
  i <- as.factor(i)
  levels(i)[which.max(tabulate(i))]})

数据

df <- read.table(header=T, text="CAT1    CAT2    CAT3
A       B       B
B       B       A
A       A       A
C       C       A
B       C       C")

如果有关系,那么将选择第一个(A over B,B over C)。