我正在寻找最常用的值(字符串)及其频率。
预期结果是一个包含三列的数据框:
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)
该模式的长度比其他向量大,并且不能附加到结果上。我敢打赌这是由于联系。
如何为该“模式”变量获得相同的长度?
答案 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