【问题标题】:How to subset 'n' number of rows past a certain value?如何对超过某个值的行数进行子集化?
【发布时间】:2016-03-18 08:48:25
【问题描述】:

我正在尝试根据 10 值对 data.frame 进行子集化 data.frame

这里是一些示例代码;

> Test
            Close   High    Low    Dn.BB     MaVg    Up.BB      Per.BB Dn.Brk
2007-02-27 6286.1 6434.7 6270.5 6305.813 6389.679 6473.544 -0.11752900      1
2007-02-28 6171.5 6286.1 6166.2 6237.635 6377.186 6516.737 -0.23695539      1
2007-03-01 6116.0 6230.7 6038.9 6164.470 6358.129 6551.787 -0.12514308      1
2007-03-02 6116.2 6164.4 6085.6 6110.807 6341.179 6571.550  0.01170495      0
2007-03-05 6058.7 6116.2 5989.6 6047.421 6318.100 6588.779  0.02083561      0
2007-03-06 6138.5 6138.5 6058.7 6018.953 6297.907 6576.861  0.21427696      0
2007-03-07 6156.5 6167.6 6106.1 6001.139 6278.136 6555.133  0.28043853      0
2007-03-08 6227.7 6233.1 6156.5 5997.989 6264.436 6530.882  0.43106389      0
2007-03-09 6245.2 6255.8 6190.3 6003.152 6250.207 6497.262  0.48986661      0
2007-03-12 6233.3 6276.3 6219.3 6007.297 6237.421 6467.546  0.49104464      0
2007-03-13 6161.2 6240.7 6161.2 6000.401 6223.429 6446.457  0.36049188      0

在这里,我想要一些沿着data.frame 迭代然后根据Dn.Brk > 0 拆分子集的东西。我在这里只能想到一个loop 方法并且对sub-setting 不熟悉,所以想知道是否有人可以指出我正确的方向/提供一些可以实现此目的的功能/包的提示?

下面有更多细节;

Sub <- rep(0,nrow(Test))
for (i in nrow(Test)){
    if (Test[i,8] > 0){Sub = Test(i:i+10,1)}
}

因此,上述内容将在Test[i,8] &gt; 0 的每个点上,从i:i+10 中选择Test$Close

理想情况下,我希望每个样本都存储在新 df 中的单独行/列中。这可能吗?

【问题讨论】:

  • 您能否也显示您想要的输出对于这个特定的数据集
  • split(Test, Test$Dn.Brk &gt; 0) ?
  • @Sotos 他们也想要一些i:i+10 条件。对于1s 在0s 之后再次出现,他们还不清楚他们想做什么
  • 我认为他们的意思是 Test[i:(i+10)] 而不是 Test[i:i+10]
  • 这个问题确实一点都不清楚....

标签: r loops vector subset sample


【解决方案1】:

你可以在这里使用 sapply:

sapply(which(Test[, 8] > 0), function(z) Test$Close[z:(z+10)])

在您提供的循环中需要注意以下几点:

  • 您没有迭代:您的循环来自i in nrow(Test),实际上是nrow(Test)
  • 每次迭代都会覆盖Sub

【讨论】:

  • 感谢您提供的额外知识。无论如何将此输出拆分为单独的行/列?例如,如果有 63 个点 > 0,那么 df 将包含此输出的 63 行/列?
  • 它在每个 Test[, 8] > 0 的单独列中
【解决方案2】:

如果您仍在寻找使用 for 循环的方法,那么答案就是:

#### results list #####
results <- list()

for (i in rows.test){
if (test[i,8] > 0)
{
  results[[i]] = test$Close[i:(i+10)]
} 
else {results[[i]] = "no value"}
}

如果您的数据集很大并且带有一个名为 foreach 的包,这也可以进一步并行化。这里有一个很好的介绍:http://www.vikparuchuri.com/blog/parallel-r-loops-for-windows-and-linux/。如果您想要一个只有三个命名元素的列表,您也可以将“无值”更改为下一个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 2017-11-21
    • 2021-06-25
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多