代码之家  ›  专栏  ›  技术社区  ›  neringab

元素最常用元素r

  •  0
  • neringab  · 技术社区  · 8 年前

    例如,我有数据帧:

    df <- data.frame(V1=c("a", "a", "b"), 
                 V2 = c("b", "a", "a"), 
                 V3 = c("a", "a", "b"))
    > df
      V1 V2 V3
    1  a  b  a
    2  a  a  a
    3  b  a  b
    

    我想找到一行中最常见的元素(a,a,b)。

    我有以下代码,它可以做到这一点:

    most_freq <- function(df){
      k <- nrow(df)
      values <- NULL
      for(i in 1:k){
        values[i] <- names(sort(table(unlist(df[i,])), decreasing = TRUE))[1]
      }
      return(values)
    }
    

    但在我看来,这很糟糕。首先,它工作缓慢,使用许多功能。有没有比这更简单的方法?记住,我也有一些因素。所以我不能使用cbind,因为它将factor转换为numeric。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Roman    8 年前

    你可以试试 tidyverse

    library(tidyverse)
    df %>% 
      rownames_to_column() %>% 
      gather(k, v, -rowname) %>% 
      group_by(rowname) %>% 
      count(v) %>% 
      filter(n==max(n))
    # A tibble: 3 x 3
    # Groups:   rowname [3]
      rowname v         n
      <chr>   <chr> <int>
    1 1       a         2
    2 2       a         3
    3 3       b         2
    

    在基地 R 你可以试试

    apply(df, 1, function(x) names(table(x))[which.max(table(x))])
    [1] "a" "a" "b"
    
        2
  •  1
  •   Wimpel    8 年前

    这对我有用(根据你的样本数据)

    apply(df, 1, median)
    [1] "a" "a" "b"
    

    但既然中位数不是办法…试试这个:

    library(dplyr)
    
    df %>% 
    #melt your data to long format
    gather() %>% 
    #group 
    group_by(key, value) %>% 
    #count per group
    summarise( number = n() ) %>% 
    #arrange secending on number
    arrange( desc( number ) ) %>%
    #filter the first row of each group
    filter(row_number()==1)
    
    # A tibble: 3 x 3
    # Groups:   key [3]
      key   value number
      <chr> <chr>  <int>
    1 V1    b          2
    2 V2    a          2
    3 V3    a          2