我需要創建自己的類物件,該物件采用資料框并具有方法“get_data”來選擇資料框,“選擇”來按名稱選擇列,“過濾器”來過濾具有某些值的行。選擇和過濾是一種類似于 dplyr,但沒有使用 dplyr。
我希望他們可以像這樣被鎖住:
result <- df_object$get_data(df)$select(col1, col2, period)$filter(period)
我該怎么做才能使“過濾器”方法過濾已選擇的值?現在它過濾初始資料集。另外如何更改方法以使選擇和過濾不需要資料引數?請給我一些提示,我覺得我做錯了。我需要在類中添加一些欄位嗎?
dataFrame <- R6Class("dataFrame",
list(data = "data.frame"),
public = list(
get_data = function(data) {data},
select_func = function(data, columns) {data[columns]},
filter_func = function(data, var) {data[var, ]}
))
# Create new object
df_object <- dataFrame$new()
# Call methods
df_object$get_data(df)
df_object$select_func(df, c("month", "forecast"))
df_object$filter_func(df[df$month %in% c(1, 2), ])
uj5u.com熱心網友回復:
如果要鏈接成員函式,則需要將這些成員函式回傳self。這意味著 R6 物件必須修改它包含的資料。由于 R6 的好處是減少副本,我可能會保留資料的完整副本,并擁有select_func和filter_func更新一些行和列索引:
library(R6)
dataFrame <- R6Class("dataFrame",
public = list(
data = data.frame(),
rows = 0,
columns = 0,
initialize = function(data) {
self$data <- data
self$rows <- seq(nrow(data))
self$columns <- seq_along(data)
},
get_data = function() {self$data[self$columns][self$rows,]},
select_func = function(cols) {
if(is.character(cols)) cols <- match(cols, names(self$data))
self$columns <- cols
self
},
filter_func = function(r) {
if(is.logical(r)) r <- which(r)
self$rows <- r
self
})
)
這允許我們鏈接過濾器和選擇方法:
dataFrame$new(iris)$filter_func(1:5)$select_func(1:2)$get_data()
#> Sepal.Length Sepal.Width
#> 1 5.1 3.5
#> 2 4.9 3.0
#> 3 4.7 3.2
#> 4 4.6 3.1
#> 5 5.0 3.6
我們的 select 方法也可以取名字:
dataFrame$new(mtcars)$select_func(c("mpg", "wt"))$get_data()
#> mpg wt
#> Mazda RX4 21.0 2.620
#> Mazda RX4 Wag 21.0 2.875
#> Datsun 710 22.8 2.320
#> Hornet 4 Drive 21.4 3.215
#> Hornet Sportabout 18.7 3.440
#> Valiant 18.1 3.460
#> Duster 360 14.3 3.570
#> Merc 240D 24.4 3.190
#> Merc 230 22.8 3.150
#> Merc 280 19.2 3.440
#> Merc 280C 17.8 3.440
#> Merc 450SE 16.4 4.070
#> Merc 450SL 17.3 3.730
#> Merc 450SLC 15.2 3.780
#> Cadillac Fleetwood 10.4 5.250
#> Lincoln Continental 10.4 5.424
#> Chrysler Imperial 14.7 5.345
#> Fiat 128 32.4 2.200
#> Honda Civic 30.4 1.615
#> Toyota Corolla 33.9 1.835
#> Toyota Corona 21.5 2.465
#> Dodge Challenger 15.5 3.520
#> AMC Javelin 15.2 3.435
#> Camaro Z28 13.3 3.840
#> Pontiac Firebird 19.2 3.845
#> Fiat X1-9 27.3 1.935
#> Porsche 914-2 26.0 2.140
#> Lotus Europa 30.4 1.513
#> Ford Pantera L 15.8 3.170
#> Ferrari Dino 19.7 2.770
#> Maserati Bora 15.0 3.570
#> Volvo 142E 21.4 2.780
為了完整起見,您需要一些型別安全性,我還將添加一個重置方法來洗掉所有過濾。這有效地為您提供了一個資料框,其中過濾和選擇是非破壞性的,這實際上可能非常有用。
由reprex 包(v2.0.1)于 2022-05-01 創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471702.html
