我正在尝试将下面已经工作的代码转换为函数。
此处已经讨论了类似的情况dcast + DT !但是我无法解决那样的问题。
我想要实现的是:
这是已经起作用的代码:
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 <-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,确切=准确)中的错误:级别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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句