我是R语言的新手.. 我想用窗口大小和幻灯片划分数据框。并将所有这些保存到单独的数据框中。
例如,我的“数据框有20行”。 那么我想划分那些窗口大小= 5和slide = 3的行。 期望的输出应该是...... 前5行应该在一个数据框中,然后enter image description here 第二个数据帧应包含5行,将数据帧的前3行保留为slide = 3.这意味着第二个数据帧应包含第2行第一个数据帧并重新存储3行剩余数据帧。
我的数据框.. 期望的输出应该是: enter image description here
答案 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个感兴趣的记录(包含所有列)。
mydata[1:5,1:2]
不仅会对第1行到第5行进行子集,还会对第1列和第2列进行子集。