График пловца R: аргументы подразумевают различное количество строк

Вопрос или проблема

Я знаю, что я очень близок к правильному коду, но продолжаю сталкиваться с проблемой, когда появляется сообщение “Ошибка в data.frame(id_fix, start_blank, end_blank): аргументы указывают на разное количество строк: 1, 0. Эта ошибка возникает только тогда, когда я вызываю финальную функцию study_plot! Большое спасибо!

library(swimplot)
library(ggplot2)
library(dplyr)

#пример данных
study_7 <- data.frame(
  study_id = c(7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8),
  ther_type = c("S", "S", "S", "S", 
                "E", "E", "E", 
                "A", "A", "A", 
                "A", "A"),
  ther_start_date = as.Date(c("2016-02-01", "2016-02-18", "2016-02-20", 
                               "2016-02-26", "2021-03-26", "2021-10-15", 
                               "2021-11-04", "2023-08-08", "2023-09-28", 
                               "2023-10-01", "2023-12-21", "2024-03-28")),
  ther_end_date = as.Date(c("2016-02-18", "2016-02-20", "2016-02-22", 
                             "2016-03-17", "2021-09-01", "2021-11-04", 
                             "2022-07-01", "2023-09-28", "2023-10-01", 
                             "2023-12-21", "2024-03-28", "2024-09-01"))
)

#создание переменной date_start_ther
# Соз создание нового столбца date_start_ther с самой ранней датой ther_start_date для каждого study_id
study_7 <- study_7 %>%
  group_by(study_id) %>%
  mutate(date_start_ther = min(ther_start_date, na.rm=TRUE)) %>%
  ungroup()  # Снять группировку с данных

# Убедитесь, что столбцы в формате Date
study_7 <- study_7 %>%
  mutate(
    ther_start_date = as.Date(ther_start_date, format = "%m/%d/%y"),
    ther_end_date = as.Date(ther_end_date, format = "%m/%d/%y"),
    date_start_ther = as.Date(date_start_ther)
  )

# Рассчитать разницу в годах
study_7 <- study_7 %>%
  mutate(
    ther_start = as.numeric(difftime(ther_start_date, date_start_ther, units = "days")) / 365.25,
    ther_end = as.numeric(difftime(ther_end_date, date_start_ther, units = "days")) / 365.25
  )


#код для графика плавца с данными пробела
study_plot <- swimmer_plot(
  df = as.data.frame(study_7), # Я ДУМАЮ, ЧТО ИМЕННО ЗДЕСЬ ОШИБКА, ПОТОМУ ЧТО ОШИБКА ПОЯВЛЯЕТСЯ ТОЛЬКО ПРИ ВЫЗОВЕ ЭТОЙ ФУНКЦИИ
  id = 'study_id',
  start = "ther_start",
  end = "ther_end",
  name_fill = "ther_type",
  width = 0.85,
  color = NA,
  id_order = sort(unique(study_7$study_id), decreasing = TRUE)
) + theme_bw(base_size = 20) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        axis.line = element_line(colour = "black")) +
  coord_flip(clip = 'off', expand = FALSE) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0))

Ответ или решение

Ошибка "arguments imply differing number of rows" в функции data.frame обычно возникает, когда вы пытаетесь создать датафрейм с векторами, длины которых не совпадают. В вашем коде это может быть связано с тем, что вы неправильно обрабатываете данные перед вызовом функции swimmer_plot. Давайте подробно рассмотрим каждый шаг и убедимся, что все данные правильно подготовлены.

  1. Проверка исходных данных: Убедитесь, что в вашем наборе данных study_7 нет пропусков (NA) в колонках ther_start_date или ther_end_date. Это может привести к созданию векторов различной длины при использование функций min() и max(), которые могут возвращать NA, когда все значения отсутствуют.

  2. Проверка на наличие дублирования: Убедитесь, что в колонне study_id нет дубликатов с отсутствующими значениями, так как это может также повлиять на размер векторов при применении group_by.

  3. Обработка данных: Проверьте выполнение каждой из промежуточных операций, особенно тех, которые используют mutate(), чтобы гарантировать, что обе колонки ther_start и ther_end содержат одинаковое количество строк.

Вот проверенный код с исправлениями:

library(swimplot)
library(ggplot2)
library(dplyr)

# Пример данных
study_7 <- data.frame(
  study_id = c(7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8),
  ther_type = c("S", "S", "S", "S", 
                "E", "E", "E", 
                "A", "A", "A", 
                "A", "A"),
  ther_start_date = as.Date(c("2016-02-01", "2016-02-18", "2016-02-20", 
                               "2016-02-26", "2021-03-26", "2021-10-15", 
                               "2021-11-04", "2023-08-08", "2023-09-28", 
                               "2023-10-01", "2023-12-21", "2024-03-28")),
  ther_end_date = as.Date(c("2016-02-18", "2016-02-20", "2016-02-22", 
                             "2016-03-17", "2021-09-01", "2021-11-04", 
                             "2022-07-01", "2023-09-28", "2023-10-01", 
                             "2023-12-21", "2024-03-28", "2024-09-01"))
)

# Создание переменной date_start_ther
study_7 <- study_7 %>%
  group_by(study_id) %>%
  mutate(date_start_ther = min(ther_start_date, na.rm = TRUE)) %>%
  ungroup()

# Убедитесь, что столбцы имеют формат даты
study_7 <- study_7 %>%
  mutate(
    ther_start_date = as.Date(ther_start_date),
    ther_end_date = as.Date(ther_end_date),
    date_start_ther = as.Date(date_start_ther)
  )

# Рассчет разницы в годах
study_7 <- study_7 %>%
  mutate(
    ther_start = as.numeric(difftime(ther_start_date, date_start_ther, units = "days")) / 365.25,
    ther_end = as.numeric(difftime(ther_end_date, date_start_ther, units = "days")) / 365.25
  )

# Код для графика swimmer plot с данными о промежутках
study_plot <- swimmer_plot(
  df = study_7,
  id = 'study_id',
  start = "ther_start",
  end = "ther_end",
  name_fill = "ther_type",
  width = 0.85,
  color = NA,
  id_order = sort(unique(study_7$study_id), decreasing = TRUE)
) + theme_bw(base_size = 20) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        axis.line = element_line(colour = "black")) +
  coord_flip(clip = 'off', expand = FALSE) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0))

print(study_plot)

Проверьте этот исправленный код и убедитесь, что он работает без ошибок. Если ошибка продолжается, проверьте, действительно ли в ваших данных есть проблемы с отсутствующими значениями или типами данных.

Оцените материал
Добавить комментарий

Капча загружается...