#r #tidyverse
Вопрос:
Я пытаюсь добавить столбцы в тиббл, чтобы их значения зависели от другого столбца. В частности, мой df содержит столбец с именем category
, и у меня есть словарь, сопоставляющий его значения с другими именами столбцов. Таким образом, я хотел бы добавить столбец с именем relevant_field_name1
и столбец с именем relevant_field_val1
, чтобы их значения зависели от конкретной строки. То же самое для relevant_field_name2
, relevant_field_val2
, и т.д.
library(collections)
cat2du_col <- dict()
cat2du_col$set('oncology', c('stage', 'is_solid'))
cat2du_col$set('covid19', c('saturation', 'is_vaccinated'))
cat_map <- function(df) {
cols <- cat2du_col$get(df[['category']], NA)
relevant_field_name1 <- cols[1]
relevant_field_name2 <- cols[2]
if (!is.na(relevant_field_name1)) {
relevant_field_val1 <- df[[relevant_field_name1]]
} else{
relevant_field_val1 <- NA
}
if (!is.na(relevant_field_name2)) {
relevant_field_val2 <- df[[relevant_field_name2]]
} else{
relevant_field_val2 <- NA
}
return(data.frame(relevant_field_name1, relevant_field_val1, relevant_field_name2, relevant_field_val2))
}
df <-
tibble(
category = c('oncology', 'covid19', 'other'),
stage = c('I', NA, NA),
is_solid = c(T, NA, NA),
saturation = c(NA, 95, NA),
is_vaccinated = c(T, F, T)
)
df %>% rowwise() %>% mutate(cat_map(.data))
Однако последняя строка выдает ошибку:
> df %>% rowwise() %>% mutate(cat_map(.data))
Предупреждение: Проблема с
mutate()
вводом..1
. ℹ..1 = cat_map(.data)
. ℹ NAs введен
принудительно ℹ Предупреждение появилось в строке 3. Предупреждение: Проблема с
mutate()
вход..1
. ℹ..1 = cat_map(.data)
. ℹ NAs введен
принудительно ℹ Предупреждение появилось в строке 3. Ошибка: Проблема с
mutate()
вход..1
...1 = cat_map(.data)
ℹ . x..1
должен возвращать
совместимые векторы в разных группахrlang::last_error()
, чтобы увидеть
, где произошла ошибка.
Ответ №1:
Ах, проблема заключалась в том, что значения новых столбцов имели несовместимые типы, некоторые были числовыми, а другие — строками. Я решил эту проблему, преобразовав все значения в строки.
cat_map <- function(df) {
cols <- cat2du_col$get(df[['category']], NA)
relevant_field_name1 <- cols[1]
relevant_field_name2 <- cols[2]
if (!is.na(relevant_field_name1)) {
relevant_field_val1 <- toString(df[[relevant_field_name1]])
} else{
relevant_field_val1 <- NA
}
if (!is.na(relevant_field_name2)) {
relevant_field_val2 <- toString(df[[relevant_field_name2]])
} else{
relevant_field_val2 <- NA
}