динамическое добавление столбцов в строчные броски тиббла «должно возвращать совместимые векторы между группами»

#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
  }