我正在尝试将下面已经有效的代码转换为函数。
类似的情况,dcast + DT,已被驳回here!但我无法解决这样的问题。
我想要实现的目标是:
这是已经有效的代码:
result1 <- dcast(setDT(data), customer_id ~ paste0("num_of_oranges",period), value.var = "num_of_oranges", sum)
result2 <- dcast(setDT(data), customer_id ~ paste0("num_of_oranges",period) + paste0("SIGN_",sign), value.var = "num_of_oranges", sum)
result3 <- dcast(setDT(data), customer_id ~ paste0("num_of_oranges",period) + paste0("SIGN_",sign) + paste0("ORIGIN_",origin), value.var = "num_of_oranges", sum)
我对这个功能的尝试:
create.Feature&lt; - function(col1,stat){
test1 <- dcast(df, df[[id]] ~ paste0("col1",df[[period]]), value.var = df[["col1"]], stat)
return(test1)
test2 <- dcast(df, df[[id]] ~ paste0("col1",df[[period]]) + paste0("SIGN",df[[sign]]), value.var = df[["col1"]], stat)
return(test2)
test3 <- dcast(df, df[[id]] ~ paste0("col1",df[[period]]) + paste0("SIGN",df[[sign]]) + paste0("ORIGIN",df[[origin]]), value.var = df[["col1"]], stat)
return(test3)
电话:
test_result <- create.Feature("num_of_oranges", sum)
我收到以下错误: .subset2中的错误(x,i,exact = exact):在1级没有这样的索引
任何?
答案 0 :(得分:1)
我尝试使用mtcars
数据集来重现您的功能。
<强>代码:强>
cars <- mtcars
result1 <- dcast(setDT(cars), cyl ~ paste0("disp", gear),
value.var = "disp",
sum)
result2 <- dcast(setDT(cars), cyl ~ paste0("disp", gear) +
paste0("am", am),
value.var = "disp",
sum)
result3 <- dcast(setDT(cars), cyl ~ paste0("disp", gear) +
paste0("am", am) +
paste0("vs", vs),
value.var = "disp",
sum)
create.Feature <- function(df, id, col1) {
test1 <- dcast(df,
df[[id]] ~ paste0(col1, df[["gear"]]),
value.var = col1,
sum)
test2 <- dcast(df,
df[[id]] ~ paste0(col1, df[["gear"]]) +
paste0("am", df[["am"]]),
value.var = col1,
sum)
test3 <- dcast(df,
df[[id]] ~ paste0(col1, df[["gear"]]) +
paste0("am", df[["am"]]) +
paste0("vs", df[["vs"]]),
value.var = col1,
sum)
list(test1, test2, test3)
}
tr <- create.Feature(df = cars,
id = "cyl",
col1 = "disp")
<强>输出:强>
tr
[[1]]
df disp3 disp4 disp5
1: 4 120.1 821.0 215.4
2: 6 483.0 655.2 145.0
3: 8 4291.4 0.0 652.0
[[2]]
df disp3_am0 disp4_am0 disp4_am1 disp5_am1
1: 4 120.1 287.5 533.5 215.4
2: 6 483.0 335.2 320.0 145.0
3: 8 4291.4 0.0 0.0 652.0
[[3]]
df disp3_am0_vs0 disp3_am0_vs1 disp4_am0_vs1 disp4_am1_vs0
1: 4 0.0 120.1 287.5 0
2: 6 0.0 483.0 335.2 320
3: 8 4291.4 0.0 0.0 0
disp4_am1_vs1 disp5_am1_vs0 disp5_am1_vs1
1: 533.5 120.3 95.1
2: 0.0 145.0 0.0
3: 0.0 652.0 0.0
但有几点:
df[[sign]]
和df[[origin]]
,我做了同样的事。stat
加入到该函数中,这就是为什么我将sum
添加到函数而不是stat
中的原因。我无法弄清问题是什么。我尝试了match.fun()
和do.call
,但似乎无法让它发挥作用。test3
是最后一个声明,我假设您想要所有三个test1
,test2
和test3
,因此我将它们合并到一个列表中这是输出(最后一个声明)。 不确定这是否是您想要的,如果没有,希望您能尽快得到它。我个人不使用data.table
,我使用了更多dplyr
。