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

时间:2015-06-05 08:41:42

标签: r subset dplyr lapply

我希望在处理后选择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)如何为每个min获取middle列的maxtimeset_nbr值?

2)如何在set_nbr内使用已评估的Mzdata.list值?

简而言之;

确定min列中的middlemaxtime值以及{{1}中每个Mz的相应set_nbr值后我希望返回原始data.list并根据resultMx值的那些提取MyMzset_nbr的列。由于每个Mz实际上对应600行,因此我想从set_nbr

中提取已定义的set_nbr系列

我们使用data.list作为time来选择factor。这里set_nbr表示提取参数不是R命令中的真实factor

此外,正如您将看到每个数据集存在四个set_nbr,但它们确实在factor

中处理不同的数据集

1 个答案:

答案 0 :(得分:1)

在适当的时候,我是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每次都以相同的方式定义,因此当然,min,median和max都是相同的。

我建议您在新问题中询问有关绘图的问题,从合并数据框dat开始。

至于你的第二个问题:

  

2)如何在data.list中选择评估的set_nbr值?

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

data.list[[2]]

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

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

如果您想要timeset_nbrresults对象的Mx和My值,并使用上面的合并dat,请在评论中澄清一下加入:left_join(results, dat)

有效,但我很困惑,因为在您的模拟数据中time是数字,但在您的新文字中,您说&#34;我们使用{{ 1}}作为time&#34;。如果您已将时间转换为系数对象,则只有在数据列表中的每个数据框中具有相同的factor时才会生效。如果没有,我建议将levels保留为time