有没有办法在R中定义一组后续的data.frame?

时间:2014-12-26 01:29:18

标签: r dataframe operation

如果我有这样的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。有没有办法可以做到这一点?提前谢谢。

4 个答案:

答案 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函数。