Мой вопрос касается выполнения вычисления между каждой парой групп в data.frame, я бы хотел, чтобы оно было более векторизованным.
У меня есть data.frame, который состоит из следующих элементов:столбцы: Location
, Sample
, Var1
и Var2
.Я хотел бы найти закрытое совпадение для каждой Sample
для каждой пары Location
с для Var1
и Var2
.
Я могу сделать это для одной пары местоположений как таковой:
df0 <- data.frame(Location = rep(c("A", "B", "C"), each =30),
Sample = rep(c(1:30), times =3),
Var1 = sample(1:25, 90, replace =T),
Var2 = sample(1:25, 90, replace=T))
df00 <- data.frame(Location = rep(c("A", "B", "C"), each =30),
Sample = rep(c(31:60), times =3),
Var1 = sample(1:100, 90, replace =T),
Var2 = sample(1:100, 90, replace=T))
df000 <- rbind(df0, df00)
df <- sample_n(df000, 100) # data
dfl <- df %>% gather(VAR, value, 3:4)
df1 <- dfl %>% filter(Location == "A")
df2 <- dfl %>% filter(Location == "B")
df3 <- merge(df1, df2, by = c("VAR"), all.x = TRUE, allow.cartesian=TRUE)
df3 <- df3 %>% mutate(DIFF = abs(value.x-value.y))
result <- df3 %>% group_by(VAR, Sample.x) %>% top_n(-1, DIFF)
Я пробовал другие возможности, такие как использование dplyr::spread
, но не смог избежать «Ошибка: дублирующиеся идентификаторы для строк» или столбцы, наполовину заполненные NA.
Существует ли более чистый и автоматизированный способ сделать это для каждой возможной пары групп?Я хотел бы избежать ручного подмножества и процедуры слияния для каждой пары.