提取按条件筛选的值列表

时间:2015-06-12 15:28:27

标签: r dplyr lapply

我有一些数据列表需要过滤一些行。

我有一些标准来提取我称之为crit的那些行。对于限定数据的每个crit,我希望将数据子集作为输出。

有时,有一组函数可以根据您设置的特定条件从较大的数据集中提取一组数据。 我认为最好的选择之一是dplyr。虽然,我观看了一些dplyr包视频,但他们主要关注的是在一些简单的例子中对行进行排序和选择。 但有时候,我们需要能够动态地提取一组变化的标准。

因此,我需要专家考虑dplyr的{​​{1}}功能。

这是我的数据的可重现的例子

data.frame

来自此set.seed(1) data.list <- lapply(1:3, function(x) { nrep <- 3 time <- rep(seq(90,54000,length.out=12),times=nrep) Mx <- c(replicate(nrep,sort(runif(12,-0.014,0.012),decreasing=TRUE))) My <- c(replicate(nrep,sort(runif(12,-0.02,0.02),decreasing=TRUE))) Mz <- c(replicate(nrep,sort(runif(12,-1,1),decreasing=TRUE))) df <- data.frame(time,Mx,My,Mz,set_nbr=x) }) 内部我想提取一些符合条件的唯一data.list

匹配条件定义自 groups输出。

crit

我在每个> crit time Mz set_nbr 1 24594.55 -0.04729751 1 2 29495.45 -0.50902297 1 3 24594.55 -0.04376393 1 4 39297.27 -0.22218980 2 5 24594.55 -0.36407263 2 6 34396.36 -0.38341534 2 7 19693.64 -0.34597255 3 8 14792.73 -0.01480776 3 9 29495.45 -0.00999671 3 Mz内找到了第一个负data.list值的观察结果。此处group表示group列中作为一个组的90:54000之间的值。所以每个data.list [[1]] 3组,data.list [[2]] 3组data.list [[3]] 3组。

我想:

  1. time输出中查找minmax time Mz groups_by set_nbr的值。
  2. 更新

    使用@akrun的答案,此任务由以下代码完成

    crit
    1. min_time<- crit %>% group_by(set_nbr) %>% filter(time==min(time)) max_time<- crit %>% group_by(set_nbr) %>% filter(time==max(time)) 内的data.list内过滤掉这些案例。
    2. 例如,如果我们要在groups输出

      中得出data.list[[2]]的{​​{1}}时间值,请min内部
      Mz

      我们会找到如下输出:

      crit

      最后,我们可以使用排序 > data.list[[2]] time Mx My Mz set_nbr 1 90.000 0.0113804381 0.0145817980 0.887449637 2 2 4990.909 0.0100259362 0.0098679308 0.772901887 2 3 9891.818 0.0050266053 0.0091723849 0.754115086 2 4 14792.727 0.0046047177 0.0045857989 0.516206105 2 5 19693.636 0.0026426272 0.0022863816 0.448997785 2 6 24594.545 0.0015677851 0.0000176389 0.423487735 2 7 29495.455 -0.0023966069 -0.0018747422 0.095293174 2 8 34396.364 -0.0027816840 -0.0018971667 0.006678971 2 9 39297.273 -0.0047251003 -0.0068489072 -0.222189800 2 10 44198.182 -0.0101464994 -0.0127653456 -0.412539690 2 11 49099.091 -0.0113172099 -0.0129949293 -0.617479780 2 12 54000.000 -0.0136599830 -0.0158004944 -0.621612755 2 13 90.000 0.0117878041 0.0158037641 0.854604177 2 14 4990.909 0.0056253446 0.0152247614 0.681014064 2 15 9891.818 0.0014885119 0.0111993956 0.565702674 2 16 14792.727 0.0009466772 0.0011852241 0.181146318 2 17 19693.636 -0.0007095856 -0.0021505871 0.033593673 2 18 24594.545 -0.0011145670 -0.0034750316 -0.364072631 2 19 29495.455 -0.0014069124 -0.0065805003 -0.433534999 2 20 34396.364 -0.0021987173 -0.0086083808 -0.462098816 2 21 39297.273 -0.0080548883 -0.0088897627 -0.464983585 2 22 44198.182 -0.0086038271 -0.0114920192 -0.562709430 2 23 49099.091 -0.0094904993 -0.0169889702 -0.779278790 2 24 54000.000 -0.0119963261 -0.0174476608 -0.798253748 2 25 90.000 0.0116124758 0.0161232645 0.922819873 2 26 4990.909 0.0101439952 0.0158178170 0.895932709 2 27 9891.818 0.0037524900 0.0142452666 0.637269377 2 28 14792.727 0.0027126828 0.0136245822 0.526445379 2 29 19693.636 0.0016400717 0.0096431459 0.435870552 2 30 24594.545 0.0015504030 0.0089490379 0.125565872 2 31 29495.455 0.0005834194 0.0057726305 0.037152275 2 32 34396.364 -0.0003232792 0.0052165649 -0.383415339 2 33 39297.273 -0.0008013126 0.0042121379 -0.487264792 2 34 44198.182 -0.0072876859 -0.0043456288 -0.637663345 2 35 49099.091 -0.0077894144 -0.0047802446 -0.741686291 2 36 54000.000 -0.0130759449 -0.0064953867 -0.799718307 2 > min_setnbr 2 13 90.000 0.0117878041 0.0158037641 0.854604177 2 14 4990.909 0.0056253446 0.0152247614 0.681014064 2 15 9891.818 0.0014885119 0.0111993956 0.565702674 2 16 14792.727 0.0009466772 0.0011852241 0.181146318 2 17 19693.636 -0.0007095856 -0.0021505871 0.033593673 2 18 24594.545 -0.0011145670 -0.0034750316 -0.364072631 2 19 29495.455 -0.0014069124 -0.0065805003 -0.433534999 2 20 34396.364 -0.0021987173 -0.0086083808 -0.462098816 2 21 39297.273 -0.0080548883 -0.0088897627 -0.464983585 2 22 44198.182 -0.0086038271 -0.0114920192 -0.562709430 2 23 49099.091 -0.0094904993 -0.0169889702 -0.779278790 2 24 54000.000 -0.0119963261 -0.0174476608 -0.798253748 2 - &gt;来绑定res输出吗? set_nbr=1group_min group_max - &gt; set_nbr=2 .....等等

      group_min

      更新

      除了@akrun回答之外,使用

      很有用
      group_max

      如果您有不同长度的数据集。

1 个答案:

答案 0 :(得分:1)

尝试

lst <- lapply(data.list, function(x) {
      x$group <- cumsum(x$time==90)
      x})
lst1 <- split(as.data.frame(min_time), min_time$set_nbr)
res <- Map(function(x, y) {
          val <- mean(y$Mz)
          Rows <- x[ceiling(x$time-y$time)==0,]
          val1 <- Rows$Mz-val
          subset(x, group==Rows$group[which.min(val1)])},
             lst, lst1)