【问题标题】:How to select specific elements and find their index in a data.frame?如何选择特定元素并在 data.frame 中找到它们的索引?
【发布时间】:2015-06-05 08:41:42
【问题描述】:

我想在处理后选择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 值以及result 中每个set_nbr 对应的Mz 值之后,我想返回到原始data.list 和根据set_nbrMz 的值提取MxMyMz 的列。由于每个set_nbr实际上对应600行,我想从data.list中提取那些定义的set_nbrs族

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

此外,您将看到每个数据集存在四个 set_nbr,但它们确实在 data.list 中处理不同的数据集

【问题讨论】:

  • 有很多代码似乎对这个问题并不重要。您能否尝试制定一个最小的示例,隔离您问题的核心?
  • @baptiste 实际上需要myfun,因为如果没有该功能,您将无法达到条件。此外,我还对每个部分的内容进行了评论。
  • 那么你应该缩小你的问题范围。看起来你有一个大问题,实际上是 3 个小问题。 “我想回到原来的data.list,根据set_nbr的值选择Mx、My、Mz值。”这听起来像问题 1。也许做一个只是那个的最小例子,然后当这部分解决后,从那里继续。
  • @Gregor 感谢您的建议。我修改了我的问题。请检查。
  • 这仍然是至少两个问题。绘制系列与提取最小值和最大值无关。我将回答第一部分。 如果您仍然需要帮助,您应该从这个问题中删除图形位,并将其作为一个单独的新问题提出

标签: r subset dplyr lapply


【解决方案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 每次的定义方式都相同,因此最小值、中值和最大值当然都是相同的。

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

关于你的第二个问题:

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

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

data.list[[2]]

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

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

为了您在 cmets 中的澄清,如果您想要 results 对象中 timeset_nbr 的 Mx 和 My 值,请使用上面我的组合 dat,只需进行连接:left_join(results, dat)

应该工作,但我有点困惑,因为在你的模拟数据中time 是数字,但在你的新文本中你说“我们使用time 作为factor ”。如果您已将时间转换为因子对象,则仅当它在数据列表中的每个数据框中具有相同的 levels 时才有效。如果没有,我建议将time 保留为numeric

【讨论】:

  • 感谢您的回答。我想我可能会混淆一些事情,并没有清楚地解释问题的独特之处。您直接从 data.list 开始,实际上它是主要数据。我们应该从结果开始并选择这些行并将它们用作 data.list 中的提取参数。我稍微修改了这个问题。 ——
  • @aoronbarlow 一旦你的问题得到回答,就不要改变它。如果您的问题发生变化,请提出新问题。
  • 您的答案有点不充分,因为您没有检查result 结果的条件,而是在data.list 中使用它们来提取相关的set_nbr 数据集。
  • @aoronbarlow 在最后添加了几段。
  • 谢谢我检查了你的 cmets。另一方面,我真的没有t know even I try to be very clear about my questions why my question still remain hard to catch. Anyway adding Mx` 和My 列在result 左侧不是我要找的东西。
猜你喜欢
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
相关资源
最近更新 更多