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