Некомфортно с R, я столкнулся со следующей проблемой:
У меня есть таблица, содержащая, среди прочего, название вида, идентификатор события, где все записи одного и того же события названы под одним и тем же идентификатором (в зависимости от времени), а также поведение, отображаемое в каждой записи, например:
Проблема в том, что, избавляясь от повторяющихся событий, я также избавляюсь и от некоторых вариантов поведения (например, Кот только проходит, а «Отдых» удаляется).
Я хотел бы сделать следующее:
Если для каждого события есть одно поведение, отличное от «Пройдено», сохраните другое поведение. Результат должен быть:
Я пытался сделать это с помощью group_by и суммировать или мутировать, но мне не удалось получить ничего удовлетворительного или без ошибок... Лучшее, что я мог получить, это:
event_bhv <- data %>% group_by(Event_ID) %>%
summarise(event_behaviour = max(Behaviour))
Это дает мне только то поведение, которое встречается чаще всего (то есть, если есть 3 прохода и 1 корм, я получаю пропуск, что не является моей целью).
Если у кого-то есть решение, это мне очень поможет.





Я думаю, что главное — найти способ filter удалить записи «Pass», которые не представляют интереса, а это !(n() > 1 & Behaviour == "Pass").
library(dplyr)
df |>
group_by(EventID) |>
filter(!(n() > 1 & Behaviour == "Pass")) |>
summarize(Behaviour = paste(unique(Behaviour), collapse = ", ")) |>
ungroup()
# A tibble: 4 × 2
EventID Behaviour
<chr> <chr>
1 E0001 Pass
2 E0002 Rest
3 E0003 Forage
4 E0004 Forage, Rest
Базовое решение R:
aggregate(
Behaviour~EventId+Species,
FUN = function(x){
paste0(unique(x), collapse = ",")
},
data = df[df$Behaviour != "Pass",]
) |> rbind(
unique(
df[
with(
df,
ave(EventId, EventId, FUN = length) == as.integer(
with(
df,
ave(
Behaviour,
EventId,
FUN = function(x){
sum(as.character(x) == "Pass")
}
)
)
)
),
]
)
) |>
(\(x) x[order(x[,"EventId"]), ])()
Входные данные:
df <- structure(
list(
EventId = c(
"E0001",
"E0002",
"E0002",
"E0002",
"E0003",
"E0003",
"E0004",
"E0004",
"E0004"
),
Species = c(
"fox",
"Cat",
"Cat",
"Cat",
"Hare",
"Hare",
"fox",
"fox",
"fox"
),
Behaviour = c(
"Pass",
"Pass",
"Rest",
"Pass",
"Forage",
"Pass",
"Forage",
"Forage",
"Rest"
)
),
class = "data.frame",
row.names = c(NA,-9L)
)
Он работает отлично. Большое спасибо!