我有一些大的数据帧,其中混合了字符和数字字符,我试图在不使用循环的情况下快速计算频率.
为了回答这个问题,让我们以以下数据帧为例:
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)
我确信有一个mutate
或mdplyr
的解决方案可以称为汇总,它比这个快得多,但我就是不喜欢它.