Динамически изменить имя CSV после функции в R - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь изменить имя файла .csv на основе имени data.frame, используемого в функции.

Функция включает использование diplyr. Everythging работает, но не экспортирует 2 CSV с определенным именем файла. Использование простой paste () дает мне ошибку

Ошибка в файле (file, ifelse (append, "a", "w")): недопустимый аргумент "description". Дополнительно: Предупреждение: In if (file == "") file <- stdout () else if (is.character (file)) {: </p>

# dataframe example
df1 <- mtcars %>% mutate(newColumn = carb*100)
df2 <- mtcars %>% mutate(newColumn = carb*200)

# create dataframe list
df_list <- list(df1, df2)

# start function
fun <- function(x) {

# example using diplyr
df <- x %>% 
  mutate(newColumn_2 = newColumn*30)

#export csv using dataframe name in the file name
write.csv(df, paste0(deparse(substitute(x)),".csv"))

}

df_list <- lapply(df_list, fun)

Вместо этого он дает мне файл с именем "X [[i]]". csvиз df1.csv И df2.csv

1 Ответ

0 голосов
/ 04 ноября 2019

Я думаю, у вас есть пара проблем. Во-первых, вам нужно присвоить имена вашим элементам списка, чтобы эти имена могли быть получены вашей функцией.

#your initial approach doesn't name the list elements
df_list <- list(df1, df2)
> names(df_list)
NULL

# so, be explicit
df_list <- list(df1 = df1, df2 = df2)
> names(df_list)
[1] "df1" "df2"

Теперь запустите модифицированную версию вашей функции, которая работает с позицией списка вместо элементов списка. Обратите внимание, что я заменил f на cyl, потому что в ваших фреймах данных нет f.

fun <- function(x) {

    df <- mutate(df_list[[x]], newColumn_2 = cyl * 30)

    write.csv(df, paste0(names(df_list)[x], ".csv"))

}

Теперь lapply(seq_along(df_list), fun) должен дать желаемый результат.

...