如果我有这样的data.frame:
X1 X2
1 1 A
2 2 A
3 3 B
4 4 B
5 5 A
6 6 A
7 7 B
8 8 B
9 9 A
10 10 A
我的目标是将一组data.frame定义为:
y1<-data[1:2,]
y2<-data[3:4,]
y3<-data[5:6,] ##...etc. by a loop.
因此,理想情况下我想使用(例如)for循环
for (i in 1:5){
y_i <- data[2*i:2*(i+1), ]
}
但是,我无法弄清楚如何定义一组后续的data.frame,例如y_i。有没有办法可以做到这一点?提前谢谢。
答案 0 :(得分:2)
为list
使用y
并生成索引序列:
y <- lapply(seq(from=1, to=nrow(dat), by=2), function(i) {
dat[i:(i+1),]
})
str(y)
## List of 5
## $ :'data.frame': 2 obs. of 2 variables:
## ..$ X1: int [1:2] 1 2
## ..$ X2: chr [1:2] "A" "A"
## $ :'data.frame': 2 obs. of 2 variables:
## ..$ X1: int [1:2] 3 4
## ..$ X2: chr [1:2] "B" "B"
## $ :'data.frame': 2 obs. of 2 variables:
## ..$ X1: int [1:2] 5 6
## ..$ X2: chr [1:2] "A" "A"
## $ :'data.frame': 2 obs. of 2 variables:
## ..$ X1: int [1:2] 7 8
## ..$ X2: chr [1:2] "B" "B"
## $ :'data.frame': 2 obs. of 2 variables:
## ..$ X1: int [1:2] 9 10
## ..$ X2: chr [1:2] "A" "A"
答案 1 :(得分:1)
如果这是基于第二个column
lst <- split(df,with(df,cumsum(c(TRUE,X2[-1]!=X2[-nrow(df)]))))
如果您需要单独的data.frame
个对象
list2env(setNames(lst, paste0('y', seq_along(lst))), envir=.GlobalEnv)
#<environment: R_GlobalEnv>
y1
# X1 X2
#1 1 A
#2 2 A
或者它仅基于固定数字2
split(df,as.numeric(gl(nrow(df),2, nrow(df))))
df <- structure(list(X1 = 1:10, X2 = c("A", "A", "B", "B", "A", "A",
"B", "B", "A", "A")), .Names = c("X1", "X2"), class = "data.frame",
row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"))
答案 2 :(得分:0)
您可以使用assign
。它将帮助您根据所要求的命名约定获取所需的数据框。
for (i in 1:5){
assign(paste("y", i, sep="_"), data[(i*2-1):(i*2), ])
}
答案 3 :(得分:0)
data <- data.frame(X1 = c(1:10), X2 = c("A", "A", "B", "B", "A", "A", "B", "B", "A", "A"))
lapply(1:5, function (i) assign(paste("y", i, sep="_"), data[2*i-1:2*i, ], envir=.GlobalEnv))
这也可行。正如'巨蟹座'所说,在这种情况下,分配可能会有所帮助。 我只是将循环更改为lapply函数。