dcast с data.table в функции
Я пытаюсь превратить приведенный ниже код, который уже работает, в функцию.
Подобная ситуация, 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
Кто-нибудь?
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
,