簡體   English   中英

用戶定義的功能,帶有數據表聚合

[英]User-Defined function with data table aggregation

我正在嘗試主要使用聚合/合並/子集數據集編寫函數。 我的數據框如下所示:

NameA   NameB   NameC   Score1   Score2
  A       F       K       3         3
  B       F       L       5         5
  C       F       M       7         4
  D       G       N       2         2
  E       G       O       5         8

我將運行的功能是:

test <- Fun(data, Score1, NameB)

首先,我要計算按NameB分組的Score1的平均值:

Fun <- function(df, col, group_by){
       setDT(df)
       df1<- df[, sapply(.SD, mean),  .SDcols = col, by= group_by]
    }

經過一些額外的編碼后,我的數據幀變為:

NameA   NameB   NameC   Score1   Score2   Group_Mean
  A       F       K       3         3          4
  B       F       L       5         5          4
  C       F       M       4         4          4
  D       G       N       2         2          5
  E       G       O       5         8          5

然后,我想用Score1!= Score2子集我的數據框。 所以我寫:

Fun <- function(df, col, group_by){
       setDT(df)
       df1<- df[, sapply(.SD, mean),  .SDcols = col, by= group_by]           
       df2 <- df1[which(df1[col] != df[Score2])]
}

但這給了我一條錯誤消息,如: Error in Ops.data.frame(df2[col], df[Score2]) : '==' only defined for equally-sized data frames

完成此步驟后,我想做一些更多的數學運算和子集,如下所示:

Fun <- function(df, col, group_by){
       setDT(df)
       df1<- df[, sapply(.SD, mean),  .SDcols = col, by= group_by]           
       df2 <- df1[which(df1[col] != df[Score2])]

       df2["NewCol"] <- abs(df2[col] - df2[Score2])
       output <- df2[which(df2[NewCol] > 1 or df2[NewCol] < 1.5)]
       return(output)
    }

我是R和R用戶定義函數的新手。 在錯誤消息部分之后,我被困了很長時間。 請,如果有人能給我以上代碼的任何建議,我將不勝感激!

我不確定鼓勵R新手輸入data.table語法和函數調用的混用是否明智。

但是,這里有一些示例函數。

library(data.table)

data <- fread(
  "NameA   NameB   NameC   Score1   Score2
  A       F       K       3         3
  B       F       L       5         5
  C       F       M       7         4
  D       G       N       2         2
  E       G       O       5         8"
)

Fun1 <- function(df, col, group_by){
  setDT(df)[, sapply(.SD, mean),  .SDcols = col, by = group_by]
}
Fun1(data, "Score1", "NameB")
  NameB V1 1: F 5.0 2: G 3.5 

請注意,在下一個示例中將使用Score2來再現OP所描繪的數據幀:

Fun2 <- function(df, col, group_by){
  setDT(df)[, Group_Mean := mean(get(col)), by = group_by]
}
Fun2(data, "Score2", "NameB")[]
  NameA NameB NameC Score1 Score2 Group_Mean 1: AFK 3 3 4 2: BFL 5 5 4 3: CFM 7 4 4 4: DGN 2 2 5 5: EGO 5 8 5 

范例3:

Fun3 <- function(df, col, group_by){
  setDT(df)[, Group_Mean := mean(get(col)), by = group_by]
  df[get(col) != Score2]
}
Fun3(data, "Score1", "NameB")[]
  NameA NameB NameC Score1 Score2 Group_Mean 1: CFM 7 4 5.0 2: EGO 5 8 3.5 

請注意,以下功能已被WRT修改為OP的草稿,以便返回非空的data.table

Fun4 <- function(df, col, group_by){
  setDT(df)[, Group_Mean := mean(get(col)), by = group_by]
  df[, NewCol := abs(get(col) - Group_Mean)]
  df[between(NewCol, 1.0, 1.5, incbounds = TRUE)]
}
Fun4(data, "Score1", "NameB")[]
  NameA NameB NameC Score1 Score2 Group_Mean NewCol 1: DGN 2 2 3.5 1.5 2: EGO 5 8 3.5 1.5 

請注意, data已被修改in place以前所有的函數調用

data
  NameA NameB NameC Score1 Score2 Group_Mean NewCol 1: AFK 3 3 5.0 2.0 2: BFL 5 5 5.0 0.0 3: CFM 7 4 5.0 2.0 4: DGN 2 2 3.5 1.5 5: EGO 5 8 3.5 1.5 

暫無
暫無

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

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