例如,我有数据框:
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,因为它将因子转换为数字。
答案 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