簡體   English   中英

將數據框拆分為特定數字

[英]Splitting a dataframe into a specific number

我手頭的任務是弄清楚如何根據列的累積和來拆分數據框。

例如,這是一個數據框

df <- data.frame(a1 = c(“X1”、“X2”、“X3”、“X4”、“X5”、“X6”、“X7”、“X8”、“X9”、“X10” ), a2 = rnorm(20, mean=5, sd=2) )

df2 <- df[order(df$a2),] # df按a2從小到大排序。

如何創建一個數據框列表,其中每個 df2 中的 a2 列總和為 10,而沒有任何行重復?

每行的結果取決於前幾行的值,因此需要一種迭代方法。 將它包裝在一個函數中可能是最簡單的:

split_sum <- function(data, column, split_by = 10) {

  x <- data[[as.character(match.call()$column)]]

  group <- current_group <- value <- 0
  
  for(i in seq(nrow(data))) {
    group[i] <- current_group
    value <- x[i] + value
    if(value > split_by) {
      current_group <- current_group + 1
      value <- 0
    }
  }
  
  setNames(split(data, group), NULL)
}

對此進行測試,我們有:

df <- data.frame(a1 = c("X1", "X2", "X3", "X4", "X5",
                        "X6", "X7", "X8", "X9", "X10"), 
                 a2 = sort(rnorm(20, mean = 10, sd = 2)))

split_sum(df, a2, 10)
#> [[1]]
#>   a1       a2
#> 1 X1 6.232476
#> 2 X2 7.466659
#> 
#> [[2]]
#>   a1       a2
#> 3 X3 7.674123
#> 4 X4 7.946872
#> 
#> [[3]]
#>   a1       a2
#> 5 X5 8.202970
#> 6 X6 8.340281
#> 
#> [[4]]
#>   a1       a2
#> 7 X7 9.046769
#> 8 X8 9.323847
#> 
#> [[5]]
#>     a1       a2
#> 9   X9 9.569602
#> 10 X10 9.955981
#> 
#> [[6]]
#>    a1       a2
#> 11 X1 10.58773
#> 
#> [[7]]
#>    a1       a2
#> 12 X2 10.69006
#> 
#> [[8]]
#>    a1      a2
#> 13 X3 10.7256
#> 
#> [[9]]
#>    a1       a2
#> 14 X4 11.61281
#> 
#> [[10]]
#>    a1       a2
#> 15 X5 11.80578
#> 
#> [[11]]
#>    a1       a2
#> 16 X6 11.91369
#> 
#> [[12]]
#>    a1       a2
#> 17 X7 12.40917
#> 
#> [[13]]
#>    a1       a2
#> 18 X8 13.11021
#> 
#> [[14]]
#>    a1       a2
#> 19 X9 14.00975
#> 
#> [[15]]
#>     a1       a2
#> 20 X10 14.11547

但是該函數的編寫方式是,例如,僅當總和達到 50 時才中斷:

split_sum(df, a2, 50)
#> [[1]]
#>   a1       a2
#> 1 X1 6.232476
#> 2 X2 7.466659
#> 3 X3 7.674123
#> 4 X4 7.946872
#> 5 X5 8.202970
#> 6 X6 8.340281
#> 7 X7 9.046769
#> 
#> [[2]]
#>     a1        a2
#> 8   X8  9.323847
#> 9   X9  9.569602
#> 10 X10  9.955981
#> 11  X1 10.587733
#> 12  X2 10.690059
#> 
#> [[3]]
#>    a1       a2
#> 13 X3 10.72560
#> 14 X4 11.61281
#> 15 X5 11.80578
#> 16 X6 11.91369
#> 17 X7 12.40917
#> 
#> [[4]]
#>     a1       a2
#> 18  X8 13.11021
#> 19  X9 14.00975
#> 20 X10 14.11547

reprex 包於 2022-06-17 創建 (v2.0.1)

暫無
暫無

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

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