我有一些大的数据帧,其中混合了字符和数字字符,我试图在不使用循环的情况下快速计算频率.

为了回答这个问题,让我们以以下数据帧为例:

df <- data.frame(
  id = paste0("SubID_", 1:((100))),
  score = as.character(sample(1:100, 100, replace=TRUE)),
  dob = sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 100)
)

我使用以下函数查找数据中最频繁的值:

  # Taken from:
  # https://www.tutorialspoint.com/r/r_mean_median_mode.htm
  mode <- function(v) {
    uniqv <- unique(v)
    uniqv[which.max(tabulate(match(v, uniqv)))]
  }

要获得如下输出,请执行以下操作:

    f <- data.frame(sapply(df, mode))
      sapply.df..mode.
id             SubID_1
score               84
dob              10739

其中,行名基本上是初始数据帧中的列名.(它们都被附加到一个文件中,用于数据摘要报告).

从这里开始,我想要做的是估计有多少数据由最频繁的分数组成,我try 使用以下函数来实现:

  frequencycounter <- function(x,df,f){
  sum(str_count(df[,x], f[x,]))/length(df[,x])
  }

其中"x"是表示列名的字符值.

然而,每当我在上面try lApply或sApply时,它都需要一段时间才能运行到完成:

    lapply(colnames(df),frequencycounter,df=df,f=f)
    lapply(list(colnames(df)),frequencycounter,y=df,z=f)
    sapply(colnames(df),frequencycounter,df=df,f=f)

我确信有一个mutatemdplyr的解决方案可以称为汇总,它比这个快得多,但我就是不喜欢它.

推荐答案

我们可以修改您提供的mode()函数:

mostfrequent <- function(v){
  uniqv <- unique(v)
  max(tabulate(match(v, uniqv)))/length(v)
}
data.frame(sapply(df, mostfrequent))
      sapply.df..mostfrequent.
id                        0.01
score                     0.04
dob                       0.01

R相关问答推荐

在R中,如何创建时间间隔的图表?

如何按排序顺序打印一个框架中所有精确的唯一值?

如何计算R数据集中每个女性的子元素数量?

如何通过Docker部署我的shiny 应用程序(多个文件)

如何使下一个按钮只出现在Rshiny 的一段时间后?""

线性模型斜率在减少原始数据时提供NA

以相同的方式对每个表进行排序

如何根据数据帧中的值从该数据帧中提取值?

有没有一种方法可以同时对rhandsontable进行排序和从rhandsontable中删除?

从R中的对数正态分布生成随机数的正确方法

为什么在BASE R中绘制线条时会看到线上的点?

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

防止在更新SHINY中的Reactive Value的部分内容时触发依赖事件

如何阻止围堵地理密度图?

对R中的列表列执行ROW Mean操作

在生成打印的自定义函数中,可以通过变量将线型或 colored颜色 设置为NULL吗?

整理曲线图、曲线图和点图

在ggplot2图表中通过端点连接点

如何使用grepl()在数据帧列表中 Select 特定字符串?

随机生成样本,同时在R内的随机样本中至少包含一次所有值