[英]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.