簡體   English   中英

將數據幀分成較小的塊

[英]Splitting a dataframe into smaller chunks

假設我有以下data.frame

> df <- data.frame(a=rep(1:3),b=rep(1:3),c=rep(4:6),d=rep(4:6))
> df
  a b c d
1 1 1 4 4
2 2 2 5 5
3 3 3 6 6

我希望能夠將此df分為兩個幀df1df2 我希望df1df的前兩列,而df2df兩列。 有沒有一種方法可以在代碼中執行此操作,因此我不必手動執行以下操作:

> df1 <- df[,1:2]
> df1
  a b
1 1 1
2 2 2
3 3 3
> df2 <- df[,3:4]
> df2
  c d
1 4 4
2 5 5
3 6 6

很好,因為我要處理的問題的列數可變,我只想能夠創建n = ncol(df)/2數據幀。 因此,如果上面的示例中還有2列,則df3將為df[,5:6]

謝謝!

假設您的data.frame具有成對的列數,這是一個很短的代碼:

>lapply(seq(1,length(df),2), function(u) df[u:(u+1)])
[[1]]
  a b
1 1 1
2 2 2
3 3 3

[[2]]
  c d
1 4 4
2 5 5
3 6 6

這可以幫助:

df <- data.frame(a=rep(1:3),b=rep(1:3),c=rep(4:6),d=rep(4:6),e=rep(4:6),f=rep(4:6) )

mylist <- list()
for ( i in 1:ncol(df) ) {
  if (i %% 2 == 0) {
    mylist[[length(mylist)+1]] <-  df[, (i-1):i ]
  }
}

輸出:

> mylist
[[1]]
  a b
1 1 1
2 2 2
3 3 3

[[2]]
  c d
1 4 4
2 5 5
3 6 6

[[3]]
  e f
1 4 4
2 5 5
3 6 6

我在這里使用6列向您展示它適用於任何數量的列(假設列數為偶數)。 所需的所有數據幀都存儲在一個列表中(因此您有一個數據幀列表),並且可以將每個數據幀作為mylist[[ <number_here> ]]

希望這可以幫助!

以下方法應適用於evenodd

 fsplit <- function(df, n, Ncol=TRUE){
      lst <- lapply(split(seq_along(df), as.numeric(gl(ncol(df),
                               n, ncol(df)))), function(i) df[i])
        if(Ncol){
             lst[sapply(lst, ncol)==n]
             }
        else {
           lst
            }
       }

fsplit(df,2)
fsplit(df,3)
fsplit(df,3,FALSE)
fsplit(df1,2)

數據

 set.seed(24)
 df1 <- as.data.frame(matrix(sample(1:10, 7*3, replace=TRUE), ncol=7))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM