GOOGLE ADS

воскресенье, 1 мая 2022 г.

Условно изменить кадр данных на основе нескольких условий R

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

У меня есть кадр данных (dummy_data), который содержит индексы некоторых наблюдений (obs) относительно заданных предметов (ID). Кадр данных состоит только из значимых данных (другими словами: желаемые условия выполнены). Последний столбец данных этого примера содержит общее количество наблюдений (total_obs).

ID <-c(rep("item_001",5),rep("item_452",8),rep("item_0001",7),rep("item_31",9),rep("item_007",5))
obs <- c(1,2,3,5,6,3,4,5,7,8,9,12,16,1,2,4,5,6,7,8,2,4,6,7,8,10,13,14,15,3,4,6,7,11)
total_obs <- c(rep(6,5),rep(16,8),rep(9,7),rep(18,9),rep(11,5))
dummy_data <- data.frame(ID, obs, total_obs)

Я хотел бы создать новый столбец (интервал) с 3 возможными значениями: «начало», «центр», «конец» на основе следующих условий:

он должен разделить общее количество наблюдений (total_obs) на 3 группы (на основе индексов - от 1-го до последнего - значение, хранящееся в столбце total_obs) и назначить значение интервала в соответствии с индексами, хранящимися в столбце obs.

Вот ожидаемый результат:

ID <- c(rep("item_001",5),rep("item_452",8),rep("item_0001",7),rep("item_31",9),rep("item_007",5))
segment <- c(1,2,3,5,6, 3,4,5,7,8,9,12,16, 1,2,4,5,6,7,8, 2,4,6,7,8,10,13,14,15, 3,4,6,7,11)
total_segments <- c(rep(6,5),rep(16,8),rep(9,7),rep(18,9),rep(11,5))
interval <- c("start","start","center","end","end","start","start","start","center","center","center","end","end","start","start","center","center","center","end","end","start","start","start","center","center","center","end","end","end", "start","start","center","center","end")
wanted_data <- data.frame(ID, segment, total_segments, interval)

Я хотел бы использовать use dplyr::ntile() с dplyr::mutate() и dplyr::case_when(), но не смог заставить свой код работать должным образом. Любые решения?


Решение проблемы

Вам просто нужно dplyr::mutate()и dplyr::case_when(). Следующее должно дать вам что-то, от чего можно отработать.

dummy_data %>%
mutate(interval = case_when(obs < (total_obs/3) ~ "start",
obs < 2*(total_obs/3) ~ "center",
TRUE ~ "end"))
# TRUE ~ "end" is the 'else' case when everything else is false

Что дает немного другие результаты. Я думаю, что следует более тщательно обдумать, где находятся конечные точки для каждого интервала, но если вы знаете, что делаете, использование комбинации <=, %/%и ceil()должно дать вам желаемый результат.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...