有平局时,在因子变量中获取模式及其频率

时间:2019-01-30 20:45:36

标签: r

我正在寻找最常用的值(字符串)及其频率。

预期结果是一个包含三列的数据框:

char: the names of the original columns
mode: the most frequent value in each char
freq: the frequency of the modes

当频率有联系时,我想将所有合格值放在一个单元格中,并用逗号分隔。 -还是有更好的表现形式?

问题:我不知道如何处理领带。

我已经使用table()函数来获取每一列的频率表。

clean <- read.xlsx("test.xlsx", sheet = "clean") %>% as_tibble()
freqtb <- apply(clean, 2, table)

这是我在freqtb中获得的第二张桌子:

$休12
个 休 天 饿 
1 33  2  1 

然后我遍历表格:

freq <- vector()
mode <- vector()
for (tb in freqtb) {

    max = max(tb)
    name = names(tb)[tb==max]

    freq <- append(freq, max)
    mode <- append(mode, name)
}
results <- data.frame(char = names(freqtb), freq = freq, mode=mode)

该模式的长度比其他向量大,并且不能附加到结果上。我敢打赌这是由于联系。

如何为该“模式”变量获得相同的长度?

1 个答案:

答案 0 :(得分:0)

您可以对代码here进行一些小的修改,以获得Mode函数。然后在数据框架上Map,并将结果rbind一起

options(stringsAsFactors = F)
set.seed(2)

df.in <- 
  data.frame(
    a = sample(letters[1:3], 10, T),
    b = sample(1:3, 10, T),
    c = rep(1:2, 5))

Mode <- function(x) {
  ux <- unique(x)
  tab <- tabulate(match(x, ux))
  ind <- which(tab == max(tab))
  data.frame(char = ux[ind], freq = tab[ind])
}

do.call(rbind, lapply(df.in, Mode))
#     char freq
# a      c    4
# b      1    4
# c.1    1    5
# c.2    2    5