Я застрял, пытаясь выяснить , как установить классы для столбцов фрейма данных на основе их имен.
Давайте предположим, что у меня есть именованный фрейм данных, и я хочудобавить класс в столбец с помощью функции.Класс определяется в другой функции, используя имя столбца:
library(dplyr)
df1 <- data.frame(hello = 1:4, world = 2:5)
add_class <- function(x, my_class) {
structure(x, class = c(class(x), my_class))
}
get_class_by_column_name <- function(column_name) {
if(grepl("hello", tolower(column_name))) {
return("greeting")
} else {
return("probably_not_greeting")
}
}
Обе эти вещи работают по назначению, отдельно:
> class(df1$hello)
[1] "integer"
> df1$hello <- add_class(df1$hello, "class_added_manually")
> class(df1$hello)
[1] "integer" "class_added_manually"
> df1$hello <- add_class(df1$hello, get_class_by_column_name("hello"))
> class(df1$hello)
[1] "integer" "class_added_manually" "greeting"
Но я хотел бы выяснить,как их объединить.Это не работает:
set_classes_by_column_names <- function(df) {
classes_df <- data.frame(name = names(df), class = '') %>%
rowwise %>%
mutate(class = get_class_by_column_name(name))
print(classes_df)
for (i in 1:length(classes_df$name)) {
add_class(my_column = df[,classes_df$name[i]], # select column by name
my_class = classes_df$class[i]) # use column name as function argument to find class
}
return(df)
}
Назначение имени все еще работает, но кажется, что он не может добавить пользовательский класс.
> df2 <- data.frame(hello = 1:4, world = 2:5)
> class(df2$hello)
[1] "integer"
> df2 <- set_classes_by_column_names(df2)
Source: local data frame [2 x 2]
Groups: <by row>
# A tibble: 2 x 2
name class
<fct> <chr>
1 hello greeting
2 world probably_not_greeting
> class(df2$hello)
[1] "integer"
В чем здесь проблема?
Кроме того, мне было бы интересно, если есть способ сделать это в конвейере dplyr вместо for (i in 1:length(classes_df$name)) {...}
часть.Проблема здесь в том, что, похоже, не существует какой-либо функции, которую можно использовать для изменения столбца фрейма данных с использованием имени столбца в качестве аргумента, но моему get_class_by_column_name
нужно имя.