我正在尝试根据data {frame data.frame
或1
值对0
进行推规。
以下是一些示例代码;
> 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] > 0
的每一点选择Test$Close
来自i:i+10
。
理想情况下,我希望每个样本都存储在新df中的单独行/列中。这可能吗?
答案 0 :(得分:1)
你可以在这里使用sapply:
sapply(which(Test[, 8] > 0), function(z) Test$Close[z:(z+10)])
您提供的循环中需要注意的一些事项:
i in nrow(Test)
,这实际上是nrow(Test)
Sub
答案 1 :(得分:0)
如果您仍然在寻找使用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/。如果您想要一个只包含三个命名元素的列表,您也可以将“无值”更改为下一个