使用窗口大小划分数据框并滑动并将其保存到多个数据框

时间:2017-05-09 14:11:26

标签: r

我是R语言的新手.. 我想用窗口大小和幻灯片划分数据框。并将所有这些保存到单独的数据框中。

例如,我的“数据框有20行”。 那么我想划分那些窗口大小= 5和slide = 3的行。 期望的输出应该是...... 前5行应该在一个数据框中,然后enter image description here 第二个数据帧应包含5行,将数据帧的前3行保留为slide = 3.这意味着第二个数据帧应包含第2行第一个数据帧并重新存储3行剩余数据帧。

我的数据框.. 期望的输出应该是: enter image description here

1 个答案:

答案 0 :(得分:0)

您可以将此作为列表执行。我根据您正在子集化的中点创建不同的数据框。

    mydata<-data.frame(dataelement1 = rep(1:20),dataelement2=letters[1:20]) ## create sample data with 20 rows
idx <- seq(from=3,to=(nrow(mydata)-3),by=3) ##identify midpoint for 20 rows with slide 5
for (i in idx){
    start = i-2; stop = i+2
    assign(paste0("newdata",i),mydata[start:stop,])
}

这将产生以下5个使用中点索引命名的数据帧。

> newdata3
  dataelement1 dataelement2
1            1            a
2            2            b
3            3            c
4            4            d
5            5            e
> newdata6
  dataelement1 dataelement2
4            4            d
5            5            e
6            6            f
7            7            g
8            8            h
> newdata9
   dataelement1 dataelement2
7             7            g
8             8            h
9             9            i
10           10            j
11           11            k
> newdata12
   dataelement1 dataelement2
10           10            j
11           11            k
12           12            l
13           13            m
14           14            n
> newdata15
   dataelement1 dataelement2
13           13            m
14           14            n
15           15            o
16           16            p
17           17            q

使用List解决方案:

## Putting results into a single list object instead##
mylist<-list()
j=1
for (i in idx){
  start = i-2; stop = i+2
  mylist[[j]] <- mydata[start:stop,]
  j=j+1
}
## The index is sequentially indexed ##
mylist[[1]]
mylist[[5]]

> mylist[[1]]
  dataelement1 dataelement2
1            1            a
2            2            b
3            3            c
4            4            d
5            5            e
> mylist[[5]]
   dataelement1 dataelement2
13           13            m
14           14            n
15           15            o
16           16            p
17           17            q

编辑:根据要求。 seq()创建一个序列。由于你的第一个窗口是3,我们告诉它从3开始。由于你希望窗口每次移动3个单位,我们有by = 3。结尾由使用nrow()'. We subtract 3 from that because we don't want a situation where the row number fails to have 2 more rows in the mydata`的数据中的行数定义。

我应该使用-2因为第18行仍然会有2行。

所以这会创建一个向量idx,它等于我们将在循环中使用的c(3,6,9,12,15)。

for (i in idx){ 
    start = i-2; stop = i+2  
    assign(paste0("newdata",i),mydata[start:stop,])
}

for (i in idx) {

这表示循环遍历idx中包含的每个值。

start = i-2; stop = i+2

因此,对于idx = 3的第一个值,我们定义start = 1和stop = 5,你是窗口。

最后一行定义了一个数据集,其前缀为newdata,后缀等于我们碰巧循环的idx值。然后,它会根据先前行上定义的start和stop值对您的数据集进行子集化。

因此,第一次通过循环时,最后一行解析为:newdata3 <- mydata[1:5,],其中包含5个感兴趣的记录(包含所有列)。

在R. This is a good reference.

中有多种子设置方式

mydata[1:5,1:2]不仅会对第1行到第5行进行子集,还会对第1列和第2列进行子集。