r- 使用求和和匹配来查找高频的第一次出现



>我从dbf导入了几个宽格式的数据框。所以每一列都是一个日期,每一行都是一个观察。因此,我每天都有500-2000次观察,具体取决于我正在查看的地理形状的大小。为了可重现,我创建了 2 个虚拟数据框,其中包含我在实际数据框中可能看到的值范围。

Data1<- data.frame(replicate(10, sample(0:1000, 20, rep= TRUE)))
Data<- data.frame(replicate(10, sample(0:1000, 20, rep= TRUE)))

由于我有许多这样的数据帧,因此我将它们放在一个列表中,以便我可以一次在多个数据帧上运行函数。

filenames<- mget(ls(pattern= 'Data'))

现在我的问题是我正在尝试编写一个函数来计算值在 0-100 范围内的每列中的出现次数。我可以通过以下方式完成此操作

library(plyr)
Datacount<- ldply(Data, function(x) length(which(x>=0 & x<=100))) 

然后,我需要能够匹配该计数数大于每列观测总数的 10% 的第一列实例(日期(。因此,对于具有 20 个观测值的数据帧,我想要 0-100 之间的单元格数大于 2 的第一个日期。我之前使用 apply 完成此操作(其中"V1"是包含计数的列名(

Datamatch<- apply (Datacount["V1"]>2,2,function(x) match (TRUE,x))

我的问题是,是否有一种方法可以将这些函数组合成一个进程,我可以将其用于"文件名"上的 for 循环或使用 lapply 系列函数之一?

有关详细信息,下面是我为在数据帧的每一行上运行而构建的单个函数的示例。这给了我一个最后日期的列索引,其中每行值为 <= 100。然后,我使用 lapply 遍历列表中的所有数据帧,并将函数的结果附加到原始数据帧。

icein<- function(dataframe({ dataframe$icein<- apply(dataframe, 1, function(x({tail(which(x<=100(, 1(}( 数据帧 }
list2env(lapply(filenames, icein(, envir= .全球环境(

将所有 'Data' 加载到一个list后,用map遍历list,得到逻辑向量 (between(., 0, 100)( 的mean检查它是否大于等于 2,unlistdata.frame,用which括起来得到位置索引,提取first

library(dplyr)
library(purrr)
n <- 0.2
mget(ls(pattern= 'Data')) %>%
map_int(~ .x %>% 
summarise_all(~ mean(between(., 0, 100)) >= n) %>% 
unlist %>%
which %>%
first)

最新更新