Вопрос или проблема
Я знаю, что я очень близок к правильному коду, но продолжаю сталкиваться с проблемой, когда появляется сообщение “Ошибка в 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
. Давайте подробно рассмотрим каждый шаг и убедимся, что все данные правильно подготовлены.
-
Проверка исходных данных: Убедитесь, что в вашем наборе данных
study_7
нет пропусков (NA
) в колонкахther_start_date
илиther_end_date
. Это может привести к созданию векторов различной длины при использование функцийmin()
иmax()
, которые могут возвращатьNA
, когда все значения отсутствуют. -
Проверка на наличие дублирования: Убедитесь, что в колонне
study_id
нет дубликатов с отсутствующими значениями, так как это может также повлиять на размер векторов при примененииgroup_by
. -
Обработка данных: Проверьте выполнение каждой из промежуточных операций, особенно тех, которые используют
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)
Проверьте этот исправленный код и убедитесь, что он работает без ошибок. Если ошибка продолжается, проверьте, действительно ли в ваших данных есть проблемы с отсутствующими значениями или типами данных.