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

Несколько моментов, хотя:

  1. Вы жестко закодировали некоторые переменные в функцию (я полагаю), например df[[sign]] а также df[[origin]], что я сделал то же самое.
  2. Я не могу получить stat в функцию, поэтому я добавил sum в функцию вместо stat, Я не могу понять, в чем проблема. Я старался match.fun() а также do.callПросто не могу заставить его работать.
  3. В вашей функции, test3 было последнее заявление, я предположил, что вы хотите все три test1, test2 а также test3поэтому я объединил их в список, и пусть это будет вывод (последнее утверждение).

Не уверен, если это то, что вы хотите, если нет, надеюсь, вы получите это в ближайшее время. Лично я не пользуюсь data.tableЯ использую больше dplyr,

Другие вопросы по тегам