如何 select 特定元素并在 data.frame 中找到它们的索引?

How to select specific elements and find their index in a data.frame?

我想select一个data.list的特定元素处理后。

为了获取过程参数,我在可重现的示例中描述了我的问题。 在下面的示例代码中,我有三组 data.list,每组有 5 列。

每个 data.list 重复自己三次,每个 data.list 分配给一个名为 set_nbr 的唯一编号,它定义了这些数据集。

#to create reproducible data (this part creates three sets of data each one repeats 3 times of those of Mx, My and Mz values along with set_nbr)
set.seed(1) 
data.list <- lapply(1:3, function(x) {
nrep <- 3
time <- rep(seq(90,54000,length.out=600),times=nrep) 
Mx <- c(replicate(nrep,sort(runif(600,-0.014,0.012),decreasing=TRUE)))
My <- c(replicate(nrep,sort(runif(600,-0.02,0.02),decreasing=TRUE)))
Mz <- c(replicate(nrep,sort(runif(600,-1,1),decreasing=TRUE)))
df <- data.frame(time,Mx,My,Mz,set_nbr=x)
})

应用一些函数后,我得到了这样的输出。

 result

       time     Mz           set_nbr
 1  27810 -1.917835e-03       1
 2  28980 -1.344288e-03       1
 3  28350 -3.426615e-05       1
 4  27900 -9.934413e-04       1
 5  25560 -1.016492e-02       2
 6  27360 -4.790767e-03       2
 7  28080 -7.062256e-04       2
 8  26550 -1.171716e-04       2
 9  26820 -2.495893e-03       3
 10 26550 -7.397865e-03       3
 11 26550 -2.574022e-03       3
 12 27990 -1.575412e-02       3  

我的问题从这里开始

1) 如何为每个 set_nbr 获取 time 列的 minmiddlemax 值?

2) 如何在 data.list 中使用评估的 set_nbrMz 值?

简而言之;

确定 time 列中的 minmiddlemax 值以及 set_nbr 中每个 set_nbr 对应的 Mz 值后=33=],我想 return 回到原来的 data.list 并根据 set_nbr 的那些提取 Mx, My, Mz 的那些列] 和 Mz 值。由于每个 set_nbr 实际上对应 600 行,我想从 data.list

中提取那些定义的 set_nbrs 系列

我们使用 time 作为 factor 到 select set_nbr。这里 factor 表示作为提取参数而不是 R 命令中的真正 factor

此外,正如您将看到的,每个数据集存在四个 set_nbr,但它们确实针对 data.list

中的不同数据集

我是 using lists of data frames 在适当的时候的大力倡导者,但在这种情况下,看起来没有任何理由将它们作为不同的列表项分开。让我们将它们组合成一个数据框。

library(dplyr)
dat = bind_rows(data.list)

那么获取您的摘要统计数据就很容易了:

dat %>% group_by(set_nbr) %>%
    summarize(min_time = min(time),
              max_time = max(time),
              middle_time = median(time))

# Source: local data frame [3 x 4]
#
#   set_nbr min_time max_time middle_time
# 1       1       90    54000       27045
# 2       2       90    54000       27045
# 3       3       90    54000       27045

在您的示例数据中,time 每次都以相同的方式定义,因此当然最小值、中值和最大值都是相同的。

我建议,在你提出的关于绘图的新问题中,从组合数据框开始 dat

关于你的第二个问题:

2) How to select evaluated set_nbr values inside of data.list?

从列表中选择单个项目,使用双括号

data.list[[2]]

但是,对于组合数据,它只是普通数据框的普通列,因此任何这些都可以工作:

dat[dat$set_nbr == 2, ]
subset(dat, set_nbr == 2)
filter(dat, set_nbr == 2)

根据您在评论中的说明,如果您想要 results 对象中 timeset_nbr 的 Mx 和 My 值,请使用我上面的组合 dat ,只需做一个连接:left_join(results, dat).

这个 应该 工作,但我有点困惑,因为在你的模拟数据中 time 是数字,但在你的新文本中你说 "we use time as a factor".如果您已将时间转换为因子对象,则只有当它在数据列表中的每个数据框中具有相同的 levels 时才有效。如果不是,我建议将 time 保留为 numeric