在函数中使用 data.table 进行 dcast
dcast with data.table in a function
我正在尝试将下面已经运行的代码转换为一个函数。
类似的情况,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 <-函数(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 级没有这样的索引
有人吗?
我尝试使用 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
不过有几点:
- 你 hard-coded 函数中的一些变量(我假设),例如
df[[sign]]
和 df[[origin]]
,我也是这样做的。
- 我似乎无法将
stat
放入函数中,这就是为什么我将 sum
添加到函数中而不是 stat
的原因。我不知道是什么问题。我尝试了 match.fun()
和 do.call
,但似乎无法正常工作。
- 在你的函数中,
test3
是最后一个语句,我假设你想要所有三个 test1
、test2
和 test3
,所以我将它们组合成一个列表并将其作为输出(最后一条语句)。
不确定这是否是您想要的,如果不是,希望您能尽快得到它。我个人不用data.table
,我用的比较多的是dplyr
.
我正在尝试将下面已经运行的代码转换为一个函数。
类似的情况,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 <-函数(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 级没有这样的索引
有人吗?
我尝试使用 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
不过有几点:
- 你 hard-coded 函数中的一些变量(我假设),例如
df[[sign]]
和df[[origin]]
,我也是这样做的。 - 我似乎无法将
stat
放入函数中,这就是为什么我将sum
添加到函数中而不是stat
的原因。我不知道是什么问题。我尝试了match.fun()
和do.call
,但似乎无法正常工作。 - 在你的函数中,
test3
是最后一个语句,我假设你想要所有三个test1
、test2
和test3
,所以我将它们组合成一个列表并将其作为输出(最后一条语句)。
不确定这是否是您想要的,如果不是,希望您能尽快得到它。我个人不用data.table
,我用的比较多的是dplyr
.