元素最常见的元素R.

时间:2018-06-12 13:15:55

标签: r row frequency

例如,我有数据框:

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)中找到大多数commont元素。

我有以下代码,这样做:

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,因为它将因子转换为数字。

2 个答案:

答案 0 :(得分:2)

您可以尝试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"

答案 1 :(得分:1)

这适用于我(在您的样本数据上)

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