【问题标题】:r- Using sum and match to find first occurrence of a high frequencyr- 使用 sum 和 match 查找高频的第一次出现
【发布时间】:2020-05-15 09:45:39
【问题描述】:

我有几个从 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 系列函数之一?

这里的详细信息是我构建的用于在数据帧的每一行中运行的单个函数的示例。这给了我最后一个日期的列索引,其中每行值

icein list2env(lapply(filenames, icein), envir= .GlobalEnv)

【问题讨论】:

    标签: r loops dataframe lapply


    【解决方案1】:

    将所有'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)
    

    【讨论】:

    • 谢谢你,@akrun 我可以在这里看到 0.2 仍然是手动编写的。是否有一种方法可以将 10% 的单元格写入 Data 中的观察次数的函数,以便可以为具有不同观察次数的数据帧调用该函数?类似round(0.1*(nrow))
    • @JamieVarney。它是自动化的。 0.2 是通过的阈值。在这里,mean 计算介于 0 和 100 之间的值的百分比。&gt;= 0.2 只检查它是否大于 20%
    • @JamieVarney。当您执行round(0.1*(nrow)) 时,0.1 是手动正确的。这里发生的情况相同,因为mean 确实根据行数创建百分比。例如v1 &lt;- c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE); mean(v1)
    • 啊,好的,谢谢,我误解了正在传递的向量的平均值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2018-11-28
    • 2016-05-10
    • 2015-06-08
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多